#include <bits/stdc++.h>
using namespace std;
const int N = 100009;
char s[N];
int t[10], in[N][10], out[N][10];
int len[N];
int r[N], l[N];
int slen;
int *dir[2] = {l, r};
void erase(int k) {
  if (out[k][0] < 0) {
    s[k] = '.';
    return;
  }
  l[r[k]] = l[k];
  r[l[k]] = r[k];
  s[k] = ' ';
}
int go(int b) {
  int n = b, d = 1, p = -1, ml = b;
  bool pd = false;
  while (n < slen && n >= b) {
    char *info = "NULL";
    ml = max(ml, n);
    if (in[n][0] < 0) {
      info = "in";
      memcpy(in[n], t, sizeof(t));
    }
    if ('0' <= s[n] && s[n] <= '9') {
      if (s[n] == '0') {
        t[0]++;
        if (out[n][0] < 0 && d == 0) {
          info = "out";
          memcpy(out[n], t, sizeof(t));
          len[n] = ml;
        }
        erase(n);
      } else {
        t[s[n] - '0']++;
        s[n]--;
      }
      pd = false;
    } else if (s[n] == '.') {
      if (d == 0) {
        info = "d out";
        memcpy(out[n], t, sizeof(t));
        len[n] = ml;
        erase(n);
      }
      n = dir[d][n];
      continue;
    } else {
      if (pd) {
        erase(p);
      }
      if (s[n] == '<') {
        d = 0;
      } else {
        d = 1;
      }
      pd = true;
    }
    if (out[n][0] < 0 && d == 0) {
      info = "out";
      memcpy(out[n], t, sizeof(t));
      len[n] = ml;
    }
    p = n;
    n = dir[d][n];
  }
  return ml;
}
int main() {
  for (int i = 0; i < N; i++) {
    l[i] = i - 1;
    r[i] = i + 1;
  }
  memset(in, -1, sizeof(in));
  memset(out, -1, sizeof(out));
  int q;
  scanf("%d %d ", &slen, &q);
  gets(s);
  int ml = -1;
  do {
    ml = go(ml + 1);
  } while (ml != slen - 1);
  memcpy(in[slen], t, sizeof(t));
  for (int i = 0; i < q; i++) {
    int L, R;
    scanf("%d %d", &L, &R);
    L--, R--;
    if (out[L][0] >= 0 && len[L] <= R) {
      for (int i = 0; i < 10; i++) {
        printf("%d ", out[L][i] - in[L][i]);
      }
    } else {
      for (int i = 0; i < 10; i++) {
        printf("%d ", in[R + 1][i] - in[L][i]);
      }
    }
    printf("\n");
  }
  return 0;
}
