#include <bits/stdc++.h>
using namespace std;
const int Max_N(100050);
const int Max_M(10 * 100050);
struct node {
  int l, r, mid, Min;
};
node segt[Max_N << 2];
void build_tree(int cur, int l, int r) {
  (segt[cur].l) = l, (segt[cur].r) = r, (segt[cur].mid) = l + ((r - l) >> 1),
  (segt[cur].Min) = 0X3F3F3F3F;
  if (l == r) return;
  build_tree((cur << 1), l, (segt[cur].mid)),
      build_tree(((cur << 1) | 1), (segt[cur].mid) + 1, r);
}
void cover(int cur, int l, int r, int v) {
  if ((segt[cur].l) == l && (segt[cur].r) == r) {
    (segt[cur].Min) = min((segt[cur].Min), v);
    return;
  }
  if (r <= (segt[cur].mid))
    cover((cur << 1), l, r, v);
  else if (l > (segt[cur].mid))
    cover(((cur << 1) | 1), l, r, v);
  else
    cover((cur << 1), l, (segt[cur].mid), v),
        cover(((cur << 1) | 1), (segt[cur].mid) + 1, r, v);
}
int query(int cur, int p) {
  if ((segt[cur].l) == (segt[cur].r)) return (segt[cur].Min);
  return min((segt[cur].Min), p <= (segt[cur].mid)
                                  ? query((cur << 1), p)
                                  : query(((cur << 1) | 1), p));
}
int N, M, Q, L[Max_N], R[Max_N], Pre[Max_M][10], F[Max_N];
char S[Max_N];
int main() {
  scanf("%d%d", &N, &Q);
  scanf("%s", S + 1);
  for (int i = 0; i <= N + 1; ++i)
    L[i] = max(0, i - 1), R[i] = min(N + 1, i + 1);
  memset(F, 0X3F, sizeof(F)), build_tree(1, 1, N + 1);
  M = 1;
  for (int p = 0, dx;;) {
    if (p == 0) dx = +1;
    if ('0' <= S[p] && S[p] <= '9') {
      ++M;
      for (int c = 0; c <= 9; ++c) Pre[M][c] = Pre[M - 1][c];
      ++Pre[M][S[p] - '0'];
      if (S[p] - '0')
        --S[p];
      else
        R[L[p]] = R[p], L[R[p]] = L[p];
    }
    if (S[p] == '<') {
      dx = -1;
      if (L[p] == 0 || S[L[p]] == '<' || S[L[p]] == '>')
        R[L[p]] = R[p], L[R[p]] = L[p];
    }
    if (S[p] == '>') {
      dx = +1;
      if (S[R[p]] == '<' || S[R[p]] == '>') R[L[p]] = R[p], L[R[p]] = L[p];
    }
    F[p] = min(F[p], M);
    if (p == N + 1) break;
    if (dx == +1)
      p = R[p];
    else
      cover(1, L[p] + 1, p, M), p = L[p];
  }
  for (int l, r, a, b; Q--;) {
    scanf("%d%d", &l, &r);
    a = F[l] + 1 - ('0' <= S[l] && S[l] <= '9'),
    b = min(F[r + 1] - ('0' <= S[r + 1] && S[r + 1] <= '9'), query(1, l));
    for (int c = 0; c <= 9; ++c)
      printf("%d ", a <= b ? Pre[b][c] - Pre[a - 1][c] : 0);
    printf("\n");
  }
  return 0;
}
