#include <bits/stdc++.h>
using namespace std;
const int N = 1E5 + 10;
int n, m, is_mo[N];
int nxt[N][2], fi[N], f[N];
int pos[N * 15], tot = 0, L[N];
int sum[N * 15][10], ans[N];
char s[N];
struct node {
  int l, r, num;
} p[N];
struct sgtree {
  int l, r, mi;
} t[N << 2];
inline void pr(void) {
  for (int i = 0; i <= n; i = nxt[i][1]) {
    if (is_mo[i])
      printf("%c", s[i] ? '>' : '<');
    else
      printf("%d", s[i]);
  }
  puts("");
}
inline int cmp(node x, node y) { return x.l > y.l; }
inline void pl(int l = 0, int r = n, int x = 1) {
  t[x] = (sgtree){l, r, tot + 1};
  if (l == r) return;
  int mid = l + r >> 1;
  pl(l, mid, x << 1);
  pl(mid + 1, r, x << 1 | 1);
}
inline void modify(int l, int v, int x = 1) {
  if (t[x].l == t[x].r) {
    t[x].mi = v;
    return;
  }
  int mid = t[x].l + t[x].r >> 1;
  if (l <= mid)
    modify(l, v, x << 1);
  else
    modify(l, v, x << 1 | 1);
  t[x].mi = min(t[x << 1].mi, t[x << 1 | 1].mi);
}
inline int query(int l, int x = 1) {
  if (t[x].r <= l) return t[x].mi;
  int mid = t[x].l + t[x].r >> 1;
  if (l <= mid)
    return query(l, x << 1);
  else
    return min(query(l, x << 1), query(l, x << 1 | 1));
}
int main() {
  scanf("%d%d%s", &n, &m, s + 1);
  s[0] = '>';
  for (int i = 0; i <= n; i++)
    if (s[i] == '<' || s[i] == '>')
      is_mo[i] = 1, s[i] = (s[i] == '>');
    else
      s[i] -= '0';
  for (int i = 1; i <= n; i++) nxt[i][1] = i + 1, nxt[i][0] = i - 1;
  nxt[0][1] = 1, nxt[n + 1][0] = n;
  int now = 0, fl = 1;
  while (now <= n) {
    pos[++tot] = now;
    if (!fi[now]) fi[now] = tot;
    for (int i = 0; i <= 9; i++) sum[tot][i] = sum[tot - 1][i];
    if (!is_mo[now]) {
      sum[tot][s[now]--]++;
      if (s[now] < 0) {
        nxt[nxt[now][1]][0] = nxt[now][0];
        nxt[nxt[now][0]][1] = nxt[now][1];
      }
    }
    if (is_mo[now] && is_mo[nxt[now][fl]] && now) {
      nxt[nxt[now][1]][0] = nxt[now][0];
      nxt[nxt[now][0]][1] = nxt[now][1];
    }
    now = nxt[now][fl];
    if (is_mo[now]) fl = s[now];
  }
  fi[n + 1] = tot + 1;
  for (int i = 1; i <= m; i++)
    scanf("%d%d", &p[i].l, &p[i].r), p[i].num = i, L[i] = p[i].l;
  sort(p + 1, p + 1 + m, cmp);
  now = tot + 1;
  pl();
  for (int i = 1; i <= m; i++) {
    while (now > fi[p[i].l]) {
      now--;
      modify(pos[now], now);
    }
    ans[p[i].num] = min(fi[p[i].r + 1], query(p[i].l - 1)) - 1;
  }
  for (int i = 1; i <= m; i++) {
    for (int j = 0; j <= 9; j++) {
      printf("%d ", sum[ans[i]][j] - sum[fi[L[i]] - 1][j]);
    }
    puts("");
  }
  return 0;
}
