#include <bits/stdc++.h>
#pragma GCC optimize("O2")
#pragma GCC optimize("unroll-loops")
using namespace std;
const int MAX = 5e5 + 5;
const long long MAX2 = 11;
const long long MOD = 1000000007;
const long long MOD2 = 1000005329;
const long long INF = 2e18;
const int dr[] = {1, 0, -1, 0, 1, 1, -1, -1, 0};
const int dc[] = {0, 1, 0, -1, 1, -1, 1, -1, 0};
const double pi = acos(-1);
const double EPS = 1e-9;
const int block = 555;
struct segtree {
  bool l, r;
  int rvmx, rvle, rvri;
  int mx, cle, cri;
} tree[1 << 20], ret;
int n, q, a, b;
bool x[MAX], lz[1 << 20];
char c;
inline segtree merge(long long szle, long long szri, segtree le, segtree ri) {
  ret.l = le.l, ret.r = ri.r;
  if (le.r || !ri.l) {
    ret.mx = max(le.cri + ri.cle, max(le.mx, ri.mx));
    ret.cle = (le.cle == szle ? szle + ri.cle : le.cle);
    ret.cri = (ri.cri == szri ? szri + le.cri : ri.cri);
  } else {
    ret.mx = max(le.mx, ri.mx);
    ret.cle = le.cle;
    ret.cri = ri.cri;
  }
  if (!le.r || ri.l) {
    ret.rvmx = max(le.rvri + ri.rvle, max(le.rvmx, ri.rvmx));
    ret.rvle = (le.rvle == szle ? szle + ri.rvle : le.rvle);
    ret.rvri = (ri.rvri == szri ? szri + le.rvri : ri.rvri);
  } else {
    ret.rvmx = max(le.rvmx, ri.rvmx);
    ret.rvle = le.rvle;
    ret.rvri = ri.rvri;
  }
  return ret;
}
inline void f(int &id, int &le, int &ri) {
  tree[id].l ^= 1, tree[id].r ^= 1;
  tree[id].mx ^= tree[id].rvmx ^= tree[id].mx ^= tree[id].rvmx;
  tree[id].cle ^= tree[id].rvle ^= tree[id].cle ^= tree[id].rvle;
  tree[id].cri ^= tree[id].rvri ^= tree[id].cri ^= tree[id].rvri;
  if (le != ri) lz[(id << 1)] ^= 1, lz[((id << 1) | 1)] ^= 1;
  lz[id] = 0;
  return;
}
void build(int id, int le, int ri) {
  if (le == ri) {
    tree[id].l = tree[id].r = x[le];
    tree[id].mx = tree[id].rvmx = tree[id].cle = tree[id].rvle = tree[id].cri =
        tree[id].rvri = 1;
    return;
  }
  int mid = le + ri >> 1;
  build((id << 1), le, mid), build(((id << 1) | 1), mid + 1, ri);
  tree[id] =
      merge(mid - le + 1, ri - mid, tree[(id << 1)], tree[((id << 1) | 1)]);
  return;
}
void upd(int id, int le, int ri) {
  if (lz[id]) f(id, le, ri);
  if (le > b || ri < a) return;
  if (le >= a && ri <= b) {
    f(id, le, ri);
    return;
  }
  int mid = le + ri >> 1;
  upd((id << 1), le, mid), upd(((id << 1) | 1), mid + 1, ri);
  tree[id] =
      merge(mid - le + 1, ri - mid, tree[(id << 1)], tree[((id << 1) | 1)]);
  return;
}
segtree que(int id, int le, int ri) {
  if (lz[id]) f(id, le, ri);
  if (le >= a && ri <= b) return tree[id];
  int mid = le + ri >> 1;
  if (a <= mid && b > mid)
    return merge(mid - max(a, le) + 1, min(b, ri) - mid,
                 que((id << 1), le, mid), que(((id << 1) | 1), mid + 1, ri));
  else if (a <= mid)
    return que((id << 1), le, mid);
  return que(((id << 1) | 1), mid + 1, ri);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> q;
  for (int i = 1; i <= n; ++i) cin >> c, x[i] = c == '>';
  build(1, 1, n);
  while (q--) {
    cin >> a >> b;
    upd(1, 1, n);
    cout << que(1, 1, n).mx << '\n';
  }
  return 0;
}
