#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
inline void smin(T &a, const U &b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T &a, const U &b) {
  if (a < b) a = b;
}
template <class T>
inline void gn(T &first) {
  char c, sg = 0;
  while (c = getchar(), (c > '9' || c < '0') && c != '-')
    ;
  for ((c == '-' ? sg = 1, c = getchar() : 0), first = 0; c >= '0' && c <= '9';
       c = getchar())
    first = (first << 1) + (first << 3) + c - '0';
  if (sg) first = -first;
}
template <class T1, class T2>
inline void gn(T1 &x1, T2 &x2) {
  gn(x1), gn(x2);
}
int power(int a, int b, int m, int ans = 1) {
  for (; b; b >>= 1, a = 1LL * a * a % m)
    if (b & 1) ans = 1LL * ans * a % m;
  return ans;
}
char s[100100];
int n, nxt[100100], pre[100100], vst[100100], fir[100100];
vector<vector<int> > cnt[10];
vector<int> pos[100100];
void del(int p) {
  nxt[pre[p]] = nxt[p];
  pre[nxt[p]] = pre[p];
}
void go(int p) {
  int cur = cnt[0].size();
  for (int i = 0; i < 10; i++) cnt[i].push_back(vector<int>(1, 0));
  int st = p;
  int dir = 1;
  int prv = 0;
  while (p >= st && p <= n) {
    vst[p] = cur;
    if (!fir[p]) fir[p] = cnt[0].back().size();
    pos[cur].push_back(p);
    for (int i = 0; i < 10; i++)
      cnt[i].back().push_back(cnt[i].back().back() + (s[p] == '0' + i));
    if (isdigit(s[p])) {
      s[p]--;
      if (s[p] < '0') del(p);
    } else {
      if (s[p] == '<')
        dir = -1;
      else if (s[p] == '>')
        dir = 1;
      if (s[prv] == '<' || s[prv] == '>') del(prv);
    }
    prv = p;
    if (dir == -1)
      p = pre[p];
    else
      p = nxt[p];
  }
}
int mn[100100];
void update(int u, int d) {
  for (; u < 100100; u += u & -u) smin(mn[u], d);
}
int calc(int u, int ans = 100100) {
  for (; u; u -= u & -u) smin(ans, mn[u]);
  return ans;
}
int L[100100];
int main() {
  int m;
  cin >> n >> m;
  scanf("%s", s + 1);
  for (int i = 1; i <= n + 1; i++) pre[i] = i - 1, nxt[i - 1] = i;
  memset(vst, -1, sizeof(vst));
  for (int i = 1; i <= n; i++)
    if (vst[i] == -1) go(i);
  memset(mn, 0x3f, sizeof(mn));
  for (int i = cnt[0].size(); i--;) {
    for (int j = pos[i].size(); j--;) {
      if (j + 1 == fir[pos[i][j]]) L[pos[i][j]] = calc(pos[i][j] - 1);
      update(pos[i][j], j + 1);
    }
    for (int j = 0; j < pos[i].size(); j++) mn[pos[i][j]] = 0x3f3f3f3f;
  }
  while (m--) {
    int l, r;
    gn(l, r);
    int ed;
    if (vst[l] == vst[r + 1])
      ed = fir[r + 1] - 1;
    else
      ed = cnt[0][vst[l]].size() - 1;
    smin(ed, L[l] - 1);
    for (int i = 0; i < 10; i++)
      printf("%d ", cnt[i][vst[l]][ed] - cnt[i][vst[l]][fir[l] - 1]);
    puts("");
  }
  return 0;
}
