#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class T>
inline void upmin(T &t, T tmp) {
  if (t > tmp) t = tmp;
}
template <class T>
inline void upmax(T &t, T tmp) {
  if (t < tmp) t = tmp;
}
inline int sgn(double x) {
  if (abs(x) < 1e-9) return 0;
  return (x > 0) ? 1 : -1;
}
const double Pi = acos(-1.0);
int gint() {
  int res = 0;
  bool neg = 0;
  char z;
  for (z = getchar(); z != EOF && z != '-' && !isdigit(z); z = getchar())
    ;
  if (z == EOF) return 0;
  if (z == '-') {
    neg = 1;
    z = getchar();
  }
  for (; z != EOF && isdigit(z); res = res * 10 + z - '0', z = getchar())
    ;
  return (neg) ? -res : res;
}
long long gll() {
  long long res = 0;
  bool neg = 0;
  char z;
  for (z = getchar(); z != EOF && z != '-' && !isdigit(z); z = getchar())
    ;
  if (z == EOF) return 0;
  if (z == '-') {
    neg = 1;
    z = getchar();
  }
  for (; z != EOF && isdigit(z); res = res * 10 + z - '0', z = getchar())
    ;
  return (neg) ? -res : res;
}
const int maxn = 100100;
int n, Q;
char s[maxn];
int b[maxn], f[maxn], g[maxn], m, S[maxn * 40][10];
void push(int k, int x) {
  upmin(f[k], ++m);
  if (b[k + 1]) upmin(g[k], m);
  memcpy(S[m], S[m - 1], sizeof(S[m]));
  if (x != -1) S[m][x]++;
}
int main() {
  int i, k;
  scanf("%d%d%s", &n, &Q, s + 1);
  memset(f, 0x3f, sizeof(f));
  memset(g, 0x3f, sizeof(g));
  for (i = (1); i <= (n); i++) {
    if (b[i]) continue;
    k = i;
    for (int d = 1, p = 0; i <= k && k <= n; k += d) {
      b[k] = 1;
      if (isdigit(s[k]))
        push(k, (s[k]--) - '0'), p = 0;
      else {
        push(k, -1);
        if (s[k] < '0') continue;
        d = (s[k] == '<') ? -1 : 1;
        if (p) s[p] = 0;
        p = k;
      }
    }
    push(k, -1);
  }
  while (Q--) {
    int x = gint(), y = gint(), l, r;
    l = f[x];
    r = (g[x - 1] < f[y + 1]) ? g[x - 1] : f[y + 1];
    for (i = (0); i <= (9); i++)
      printf("%d%c", S[r - 1][i] - S[l - 1][i], (i == 9) ? '\n' : ' ');
  }
  return 0;
}
