#include <bits/stdc++.h>
using namespace std;
struct wie {
  int pier, ost;
};
const int INF = 1000000000;
vector<wie> T;
int l, size;
void Stworz(int n) {
  int p = 1;
  while (p < n) p *= 2;
  l = p;
  size = 2 * p - 1;
  for (int i = 0; i <= size; ++i) T.push_back({INF, -INF});
}
wie Merge(wie a, wie b) { return {min(a.pier, b.pier), max(a.ost, b.ost)}; }
void Ustaw(int a, wie x) {
  a += l;
  T[a] = x;
  a /= 2;
  while (a != 0) {
    T[a] = Merge(T[2 * a], T[2 * a + 1]);
    a /= 2;
  }
}
wie Pyt(int a, int b) {
  if (a > b) return {INF, -INF};
  a += l;
  b += l;
  wie w = T[a];
  w.pier = min(w.pier, T[b].pier);
  w.ost = max(w.ost, T[b].ost);
  while (a / 2 != b / 2) {
    if (a % 2 == 0) {
      w.pier = min(w.pier, T[a + 1].pier);
      w.ost = max(w.ost, T[a + 1].ost);
    }
    if (b % 2 == 1) {
      w.pier = min(w.pier, T[b - 1].pier);
      w.ost = max(w.ost, T[b - 1].ost);
    }
    a /= 2;
    b /= 2;
  }
  return w;
}
void DodajCyf(vector<vector<int> >& prefy, int c) {
  for (int i = 0; i < 10; ++i) {
    if (prefy[i].size() != 0)
      prefy[i].push_back(prefy[i].back());
    else
      prefy[i].push_back(0);
  }
  if (c != -1) ++prefy[c][prefy[c].size() - 1];
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, q;
  string s;
  cin >> n >> q >> s;
  vector<int> posy;
  vector<vector<int> > prefy(10);
  Stworz(n);
  for (int i = 0; i < n; ++i) Ustaw(i, {i, i});
  int maxPos = -INF;
  for (int start = Pyt(0, n - 1).pier; start != INF;
       start = Pyt(0, n - 1).pier) {
    int aktPos = start, aktKier = 1;
    while (aktPos >= start && aktPos < n) {
      maxPos = max(maxPos, aktPos);
      if (posy.size() != 0 && posy.back() != -INF && posy.back() != INF) {
        if (s[posy.back()] >= '0' && s[posy.back()] <= '9') {
          if (s[posy.back()] == '0')
            Ustaw(posy.back(), {INF, -INF});
          else
            --s[posy.back()];
        } else {
          if (s[aktPos] == '<' || s[aktPos] == '>')
            Ustaw(posy.back(), {INF, -INF});
        }
      }
      if (s[aktPos] >= '0' && s[aktPos] <= '9')
        DodajCyf(prefy, s[aktPos] - '0');
      else {
        DodajCyf(prefy, -1);
        if (s[aktPos] == '>')
          aktKier = 1;
        else
          aktKier = -1;
      }
      posy.push_back(aktPos);
      if (aktKier == 1)
        aktPos = Pyt(aktPos + 1, n - 1).pier;
      else
        aktPos = Pyt(0, aktPos - 1).ost;
    }
    posy.push_back(aktPos);
    DodajCyf(prefy, -1);
    while (Pyt(0, n - 1).pier <= maxPos) Ustaw(Pyt(0, n - 1).pier, {INF, -INF});
  }
  vector<int> pier(n, -1);
  for (int i = 0; i < posy.size(); ++i)
    if (posy[i] != INF && posy[i] != -INF && pier[posy[i]] == -1)
      pier[posy[i]] = i;
  vector<int> l(q), r(q);
  vector<vector<int> > nrPyt(posy.size());
  for (int i = 0; i < q; ++i) {
    cin >> l[i] >> r[i];
    --l[i];
    --r[i];
    nrPyt[pier[l[i]]].push_back(i);
  }
  vector<vector<int> > odp(q, vector<int>(10));
  set<pair<int, int> > SL, SP;
  for (int i = posy.size() - 1; i >= 0; --i) {
    SP.insert(make_pair(posy[i], i));
    SL.insert(make_pair(-posy[i], i));
    for (int j = 0; j < nrPyt[i].size(); ++j) {
      int L = i;
      int R = INF;
      pair<int, int> x = *SP.lower_bound(make_pair(r[nrPyt[i][j]] + 1, -INF));
      if (x != *SP.end()) R = min(R, x.second);
      x = *SL.lower_bound(make_pair(-(posy[i] - 1), -INF));
      if (x != *SL.end()) R = min(R, x.second);
      --R;
      for (int k = 0; k < 10; ++k) {
        int S = prefy[k][R];
        if (L != 0) S -= prefy[k][L - 1];
        odp[nrPyt[i][j]][k] = S;
      }
    }
  }
  for (int i = 0; i < q; ++i) {
    for (int j = 0; j < 10; ++j) cout << odp[i][j] << " ";
    cout << endl;
  }
  return 0;
}
