#include <bits/stdc++.h>   using namespace std;   const int T = 1 << 19;   struct nod {     int best = 0, best2 = 0;     int pref0 = 0, pref1 = 0, suf0 = 0, suf1 = 0;     int pref01 = 0, pref10 = 0, suf01 = 0, suf10 = 0;     int cnt0 = 0, cnt1 = 0;   };   void umax(int &a, int b) { a = max(a, b); }   nod merge(nod a, nod b) {     nod c;     c.cnt0 = a.cnt0 + b.cnt0;     c.cnt1 = a.cnt1 + b.cnt1;     c.best = max({a.best, b.best, a.suf01 + b.pref1, a.suf0 + b.pref01});     c.best2 = max({a.best2, b.best2, a.suf10 + b.pref0, a.suf1 + b.pref10});     c.suf0 = (b.cnt1 == 0 ? b.suf0 + a.suf0 : b.suf0);     c.suf1 = (b.cnt0 == 0 ? b.suf1 + a.suf1 : b.suf1);     c.pref0 = (a.cnt1 == 0 ? a.pref0 + b.pref0 : a.pref0);     c.pref1 = (a.cnt0 == 0 ? a.pref1 + b.pref1 : a.pref1);     c.pref01 = (a.cnt1 == 0 ? a.cnt0 + b.pref01 : a.pref01);     if (a.pref01 == a.cnt0 + a.cnt1) umax(c.pref01, a.pref01 + b.pref1);     umax(c.pref01, max(c.pref0, c.pref1));     c.pref10 = (a.cnt0 == 0 ? a.cnt1 + b.pref10 : a.pref10);     if (a.pref10 == a.cnt0 + a.cnt1) umax(c.pref10, a.pref10 + b.pref0);     umax(c.pref10, max(c.pref0, c.pref1));     c.suf01 = (b.cnt0 == 0 ? b.cnt1 + a.suf01 : b.suf01);     if (b.suf01 == b.cnt0 + b.cnt1) umax(c.suf01, b.suf01 + a.suf0);     umax(c.suf01, max(c.suf0, c.suf1));     c.suf10 = (b.cnt1 == 0 ? b.cnt0 + a.suf10 : b.suf10);     if (b.suf10 == b.cnt0 + b.cnt1) umax(c.suf10, b.suf10 + a.suf1);     umax(c.suf10, max(c.suf0, c.suf1));     return c;   }   nod t[T + T];   bool tag[T + T];   int n, m;   char s[T];   void odwroc(int v) {     swap(t[v].best, t[v].best2);     swap(t[v].cnt0, t[v].cnt1);     swap(t[v].pref01, t[v].pref10);     swap(t[v].suf01, t[v].suf10);     swap(t[v].pref0, t[v].pref1);     swap(t[v].suf0, t[v].suf1);   }   void push(int v) {     if (!tag[v]) return;     for (auto u : {2 * v, 2 * v + 1}) {       tag[u] ^= 1;       odwroc(u);     }     tag[v] = 0;   }   void invert(int x, int y, int v = 1, int l = 0, int r = T - 1) {     if (x <= l && r <= y) {       tag[v] ^= 1;       odwroc(v);       return;     }     push(v);     int m = (l + r) / 2;     if (x <= m) invert(x, y, 2 * v, l, m);     if (m < y) invert(x, y, 2 * v + 1, m + 1, r);     t[v] = merge(t[2 * v], t[2 * v + 1]);   }   nod query(int x, int y, int v = 1, int l = 0, int r = T - 1) {     if (x <= l && r <= y) {       return t[v];     }     push(v);     nod res;     int m = (l + r) / 2;     if (x <= m) res = merge(res, query(x, y, 2 * v, l, m));     if (m < y) res = merge(res, query(x, y, 2 * v + 1, m + 1, r));     return res;   }   int main() {     scanf( %d%d , &n, &m);     scanf( %s , s + 1);     for (int i = 1; i <= n; ++i) {       int v = i + T;       t[v].best = 1;       if (s[i] ==  > )         t[v].pref0 = t[v].suf0 = t[v].pref01 = t[v].pref10 = t[v].suf01 =             t[v].suf10 = t[v].cnt0 = t[v].best2 = 1;       else         t[v].pref1 = t[v].suf1 = t[v].pref01 = t[v].pref10 = t[v].suf01 =             t[v].suf10 = t[v].cnt1 = t[v].best2 = 1;     }     for (int i = T - 1; 1 <= i; --i) t[i] = merge(t[2 * i], t[2 * i + 1]);     while (m--) {       int a, b;       scanf( %d%d , &a, &b);       invert(a, b);       printf( %d n , query(a, b).best);     }     return 0;   }