const int MAXN=5e5+5;
struct Node{
int str[2][2],ans;
bool type;
}node[MAXN<<2][2];
int lef[MAXN<<2],rig[MAXN<<2];
bool isleaf[MAXN<<2],lazy[MAXN<<2];
char buf[MAXN];
Node merge(const Node &lef,const Node &rig){
Node temp;
temp.ans=max(lef.ans,rig.ans);
if(lef.type&&rig.type){
temp.type=true;
temp.str[0][0]=lef.str[0][0];
temp.str[0][1]=lef.str[0][1];
temp.str[1][0]=rig.str[1][0];
temp.str[1][1]=rig.str[1][1];
if(lef.str[1][1]&&rig.str[0][0])
temp.ans=max(max(lef.str[1][0]+lef.str[1][1],rig.str[0][0]+rig.str[0][1]),temp.ans);
else
temp.ans=max(lef.str[1][0]+lef.str[1][1]+rig.str[0][0]+rig.str[0][1],temp.ans);
}
else if(lef.type){
temp.type=true;
temp.str[0][0]=lef.str[0][0];
temp.str[0][1]=lef.str[0][1];
if(lef.str[1][1]&&rig.str[0][0]){
temp.ans=max(lef.str[1][0]+lef.str[1][1],temp.ans);
temp.str[1][0]=rig.str[0][0];
temp.str[1][1]=rig.str[0][1];
}
else{
temp.str[1][0]=lef.str[1][0]+rig.str[0][0];
temp.str[1][1]=lef.str[1][1]+rig.str[0][1];
}
}
else if(rig.type){
temp.type=true;
temp.str[1][0]=rig.str[1][0];
temp.str[1][1]=rig.str[1][1];
if(lef.str[0][1]&&rig.str[0][0]){
temp.ans=max(rig.str[0][0]+rig.str[0][1],temp.ans);
temp.str[0][0]=lef.str[0][0];
temp.str[0][1]=lef.str[0][1];
}
else{
temp.str[0][0]=lef.str[0][0]+rig.str[0][0];
temp.str[0][1]=lef.str[0][1]+rig.str[0][1];
}
}
else{
if(lef.str[0][1]&&rig.str[0][0]){
temp.type=true;
temp.str[0][0]=lef.str[0][0];
temp.str[0][1]=lef.str[0][1];
temp.str[1][0]=rig.str[0][0];
temp.str[1][1]=rig.str[0][1];
}
else{
temp.type=false;
temp.str[0][0]=lef.str[0][0]+rig.str[0][0];
temp.str[0][1]=lef.str[0][1]+rig.str[0][1];
temp.str[1][0]=temp.str[1][1]=0;
}
}
return temp;
}
void push_down(int k){
if(lazy[k]){
swap(node[k][0],node[k][1]);
lazy[k]=false;
if(!isleaf[k])
lazy[k<<1]^=1,lazy[k<<1|1]^=1;
}
}
void push_up(int k){
push_down(k<<1);push_down(k<<1|1);
node[k][0]=merge(node[k<<1][0],node[k<<1|1][0]);
node[k][1]=merge(node[k<<1][1],node[k<<1|1][1]);
}
void build(int k,int L,int R){
lef[k]=L,rig[k]=R;
int M=L+R>>1;
if(L==R){
isleaf[k]=true;
if(buf[M]=='<'){
node[k][0].str[0][1]=1;
node[k][1].str[0][0]=1;
}
else{
node[k][0].str[0][0]=1;
node[k][1].str[0][1]=1;
}
return;
}
build(k<<1,L,M);
build(k<<1|1,M+1,R);
push_up(k);
}
void update(int k,int L,int R){
if(L<=lef[k]&&rig[k]<=R)
return lazy[k]^=1,void();
push_down(k);
int mid=lef[k]+rig[k]>>1;
if(mid<L)
update(k<<1|1,L,R);
else if(mid>=R)
update(k<<1,L,R);
else{
update(k<<1,L,R);
update(k<<1|1,L,R);
}
push_up(k);
}
Node query(int k,int L,int R){
push_down(k);
if(L<=lef[k]&&rig[k]<=R)
return node[k][0];
int mid=lef[k]+rig[k]>>1;
if(mid<L)
return query(k<<1|1,L,R);
else if(mid>=R)
return query(k<<1,L,R);
else
return merge(query(k<<1,L,R),query(k<<1|1,L,R));
}
int main()
{
int n=read_int(),q=read_int(),l,r;
Node temp;
scanf("%s",buf+1);
build(1,1,n);
while(q--){
l=read_int(),r=read_int();
update(1,l,r);
temp=query(1,l,r);
enter(max(temp.ans,max(temp.str[0][0]+temp.str[0][1],temp.str[1][0]+temp.str[1][1])));
}
return 0;
}