#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -1;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  return x * f;
}
const int MAXN = 100010;
const int INF = 2147483600;
int N, Q;
char str[MAXN + 1];
int Tim[MAXN * 10 + 1], nxt[2][MAXN + 1];
int S[MAXN * 10 + 1][11];
vector<pair<int, int> > vec[MAXN * 10 + 1];
int pth[MAXN * 10 + 1];
int ans[MAXN + 1][11];
inline void Erase(int x) {
  nxt[0][nxt[1][x]] = nxt[0][x];
  nxt[1][nxt[0][x]] = nxt[1][x];
  nxt[0][x] = 0, nxt[1][x] = N + 1;
}
int top, last;
int mn[MAXN << 2];
inline void mdf(int rt, int l, int r, int k, int x) {
  if (l == r) {
    mn[rt] = x;
    return;
  }
  int mid = (l + r) >> 1;
  if (k <= mid)
    mdf(rt << 1, l, mid, k, x);
  else
    mdf(rt << 1 | 1, mid + 1, r, k, x);
  mn[rt] = min(mn[rt << 1], mn[rt << 1 | 1]);
}
inline int Query(int rt, int l, int r, int L, int R) {
  if (L <= l && R >= r) return mn[rt];
  int mid = (l + r) >> 1, ans = INF;
  if (L <= mid) ans = min(ans, Query(rt << 1, l, mid, L, R));
  if (R > mid) ans = min(ans, Query(rt << 1 | 1, mid + 1, r, L, R));
  return ans;
}
int main() {
  N = read(), Q = read();
  scanf("%s", str + 1);
  for (int i = 1; i <= N; i++) nxt[1][i] = i + 1, nxt[0][i] = i - 1;
  for (int low = 1, mx = 0; low <= N; low = mx + 1) {
    int now = low;
    last = -1;
    int dir = 1;
    while (now >= low && now <= N) {
      if (str[now] == '<' || str[now] == '>') {
        if (last != -1 && !isdigit(str[last])) Erase(last);
        dir = (str[now] == '<' ? 0 : 1);
        last = now;
      }
      ++top;
      pth[top] = now;
      for (int i = 0; i < 10; i++) S[top][i] = S[top - 1][i];
      if (isdigit(str[now])) S[top][str[now] - '0']++, last = -1;
      int ers = -1;
      if (str[now] == '0')
        ers = now;
      else if (isdigit(str[now]))
        str[now]--;
      mx = max(mx, now);
      now = nxt[dir][now];
      if (ers != -1) Erase(ers);
    }
    pth[++top] = now;
  }
  for (int i = top; i >= 1; i--) Tim[pth[i]] = i;
  for (int i = 1; i <= Q; i++) {
    int l = read(), r = read();
    vec[Tim[l]].push_back(make_pair(r, i));
  }
  memset(mn, 127, sizeof(mn));
  for (int i = top; i >= 1; i--) {
    for (int j = 0, sz = vec[i].size(); j < sz; j++) {
      pair<int, int> x = vec[i][j];
      int l, r;
      l = i;
      r = min(Query(1, 0, N + 1, x.first + 1, N + 1),
              Query(1, 0, N + 1, 0, pth[i] - 1)) -
          1;
      for (int k = 0; k < 10; k++) ans[x.second][k] = S[r][k] - S[l - 1][k];
    }
    mdf(1, 0, N + 1, pth[i], i);
  }
  for (int i = 1; i <= Q; i++) {
    for (int k = 0; k < 10; k++) printf("%d ", ans[i][k]);
    printf("\n");
  }
  return 0;
}
