#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, c = getchar(), f = 0;
  for (; c > '9' || c < '0'; f = c == '-', c = getchar())
    ;
  for (; c >= '0' && c <= '9'; x = (x << 1) + (x << 3) + c - '0', c = getchar())
    ;
  return f ? -x : x;
}
inline void write(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10) write(x / 10);
  putchar(x % 10 + 48);
}
const int N = 100000 + 10;
int n, q, Time, sum[N * 50][10], num[10];
bool vis[N];
char s[N];
vector<int> tim[N];
int get(int x, int y) {
  int res = lower_bound(tim[x].begin(), tim[x].end(), y) - tim[x].begin();
  return res == (int)tim[x].size() ? 1e9 : tim[x][res];
}
int main() {
  n = read(), q = read();
  scanf("%s", s + 1);
  for (int st = (int)1, _y = n; st <= _y; st++)
    if (!vis[st]) {
      int i = st;
      for (int step = 1, pre = 0; i >= st && i <= n; i += step) {
        vis[i] = 1;
        if (s[i] >= '0' && s[i] <= '9')
          num[s[i] - 48]++, s[i]--, pre = 0;
        else if (s[i] == '>' || s[i] == '<') {
          step = s[i] == '>' ? 1 : -1;
          if (pre) s[pre] = '#';
          pre = i;
        }
        tim[i].push_back(++Time);
        for (int j = (int)0, _y = 9; j <= _y; j++) sum[Time][j] = num[j];
      }
      tim[i].push_back(++Time);
      for (int j = (int)0, _y = 9; j <= _y; j++) sum[Time][j] = num[j];
    }
  for (; q--;) {
    int l = read(), r = read(), L = tim[l][0],
        R = min(get(l - 1, L), get(r + 1, L));
    for (int i = (int)0, _y = 9; i <= _y; i++)
      write(sum[R - 1][i] - sum[L - 1][i]), putchar(i == 9 ? '\n' : ' ');
  }
}
