#include <bits/stdc++.h>
using namespace std;
const int NMax = 110000;
struct pii {
  int x, y;
};
pii mp(int x, int y) {
  pii ret;
  ret.x = x;
  ret.y = y;
  return ret;
}
struct node {
  node *next, *prev;
  int pos, type;
} pool[NMax];
int N, Q, L, first[NMax], res[NMax * 10];
char A[NMax];
vector<pii> S;
void del(node *p) {
  if (p->next) p->next->prev = p->prev;
  if (p->prev) p->prev->next = p->next;
}
int T[NMax], sum[10][NMax * 10];
void change(int a, int b) {
  a++;
  for (int i = a; i <= N + 1; i += ((i) & ((i) ^ (i - 1)))) T[i] = min(T[i], b);
}
int calc(int a) {
  int ret = 1000000000;
  a++;
  for (int i = a; i > 0; i -= ((i) & ((i) ^ (i - 1)))) ret = min(ret, T[i]);
  return ret;
}
int main() {
  scanf("%d%d%s", &N, &Q, A);
  node *seq = &pool[L++];
  seq->next = seq->prev = NULL;
  seq->pos = 1;
  seq->type = A[0];
  node *p = seq;
  for (int i = 1; i < N; i++) {
    node *q = &pool[L++];
    q->prev = p;
    q->pos = i + 1;
    q->type = A[i];
    p->next = q;
    p = q;
  }
  p = seq;
  int dir = 1;
  node *rightmost = seq;
  while (p) {
    S.push_back(mp(p->pos, p->type));
    if (rightmost && p->pos >= rightmost->pos) rightmost = p->next;
    if (!first[p->pos]) first[p->pos] = S.size();
    int DEL = 0;
    if (p->type == '0') DEL = 1;
    if (p->type == '<')
      dir = 0;
    else if (p->type == '>')
      dir = 1;
    else if (p->type != '0')
      p->type--;
    if (p->type == '<' && dir == 0 && p->prev &&
        (p->prev->type == '<' || p->prev->type == '>'))
      DEL = 1;
    if (p->type == '>' && dir == 1 && p->next &&
        (p->next->type == '<' || p->next->type == '>'))
      DEL = 1;
    if (dir) {
      if (p->next) {
        if (DEL) {
          node *q = p->next;
          del(p);
          p = q;
        } else
          p = p->next;
      } else
        p = NULL;
    } else {
      if (p->prev) {
        if (DEL) {
          node *q = p->prev;
          del(p);
          p = q;
        } else
          p = p->prev;
      } else {
        S.push_back(mp(0, 0));
        p = rightmost;
        if (p) p->prev = NULL;
        dir = 1;
      }
    }
  }
  for (int i = 1; i <= N; i++) T[i] = 1000000000;
  for (int i = S.size() - 1; i >= 0; i--) {
    res[i + 1] = calc(S[i].x - 1);
    change(S[i].x, i + 1);
  }
  for (int i = 0; i < S.size(); i++) {
    if (S[i].y >= '0' && S[i].y <= '9') sum[S[i].y - '0'][i + 1] = 1;
    for (int j = 0; j < 10; j++) sum[j][i + 1] += sum[j][i];
  }
  while (Q--) {
    int x, y;
    int tmp1, tmp2;
    scanf("%d%d", &x, &y);
    tmp1 = res[first[x]];
    if (y == N)
      tmp2 = S.size() + 1;
    else
      tmp2 = first[y + 1];
    for (int i = 0; i < 10; i++)
      printf("%d ", sum[i][min(tmp1, tmp2) - 1] - sum[i][first[x] - 1]);
    puts("");
  }
  getchar();
  getchar();
  return 0;
}
