#include <bits/stdc++.h>
using namespace std;
int ToInt(string& s, int len) {
  int r = 0;
  for (int i = 0, max_ = (len); i < max_; ++i) {
    r *= 10;
    r += s[i] - '0';
  }
  return r;
}
int GCD(int a, int b) { return b != 0 ? GCD(b, a % b) : a; }
int LCM(int a, int b) { return a * (b / GCD(a, b)); }
long long Pow(long long n, long long e) {
  if (e == 0) return 1;
  if (e == 1)
    return n;
  else if (e & 1) {
    long long t = Pow(n, e / 2);
    return n * t * t;
  } else {
    long long t = Pow(n, e / 2);
    return t * t;
  }
}
int dx[2] = {1, -1};
int main() {
  char b[1000];
  string s, c;
  int res[10];
  int N, Q, start, end;
  scanf("%d %d", &N, &Q);
  gets(b);
  gets(b);
  s = b;
  for (int i = 0, max_ = (Q); i < max_; ++i) {
    scanf("%d %d", &start, &end);
    c = s.substr(start - 1, end - start + 1);
    memset(res, 0, sizeof(res));
    ;
    int cp = 0;
    int dp = 0, last;
    while (true) {
      if (cp < 0 || cp >= (int)(c).size()) break;
      if (c[cp] == '#') {
        cp += dx[dp];
        continue;
      }
      if (isdigit(c[cp])) {
        ++res[c[cp] - '0'];
        if (c[cp] == '0')
          c[cp] = '#';
        else
          --c[cp];
        cp += dx[dp];
      } else if (c[cp] == '>') {
        dp = 0;
        last = cp;
        cp += dx[dp];
        while (cp >= 0 && cp < (int)(c).size() && c[cp] == '#') cp += dx[dp];
        if (cp < 0 || cp >= (int)(c).size()) break;
        if (c[cp] == '<' || c[cp] == '>') c[last] = '#';
      } else if (c[cp] == '<') {
        dp = 1;
        last = cp;
        cp += dx[dp];
        while (cp >= 0 && cp < (int)(c).size() && c[cp] == '#') cp += dx[dp];
        if (cp < 0 || cp >= (int)(c).size()) break;
        if (c[cp] == '<' || c[cp] == '>') c[last] = '#';
      }
    }
    for (int i = 0, max_ = (10); i < max_; ++i) printf("%d ", res[i]);
    printf("\n");
  }
  return 0;
}
