#include<fstream.h>
ifstream fin("marbles.in");
ofstream fout("marbles.out");
struct nod
{int li,ls,c[65];
nod *st,*dr;
}*r;
struct bila
{int p,c;}v[100001];
int n,m,cmax;
void schimba(nod *p,int i,int j)
{if(p->li==p->ls) v[p->li].p+=j;
else
{int k=(p->li+p->ls)/2;
if(v[k].p<i) schimba(p->dr,i,j);
else schimba(p->st,i,j);
}
}
nod * construieste(int i,int j)
{nod *p;
p=new nod;
p->li=i;
p->ls=j;
int g;
for(g=1;g<=cmax;g++) p->c[g]=0;
if(i==j)
{p->c[v[i].c]=1;
return p;
}
int k=(i+j)/2;
p->st=construieste(i,k);
p->dr=construieste(k+1,j);
for(g=1;g<=cmax;g++) p->c[g]=p->st->c[g]+p->dr->c[g];
return p;
}
nod *adauga(nod *a,nod *b)
{nod *p;
p=new nod;
p->li=a->li;
p->ls=b->ls;
for(int i=1;i<=cmax;i++) p->c[i]=a->c[i]+b->c[i];
delete a;
delete b;
return p;
}
nod * copiaza(nod *x)
{nod *p;
p=new nod;
p->st=x->st;
p->dr=x->dr;
for(int i=1;i<=cmax;i++) p->c[i]=x->c[i];
return p;
}
nod * cauta(nod *p,int i,int j)
{if(i<=v[p->li].p && j>=v[p->ls].p) return copiaza(p);
int k=(p->li+p->ls)/2;
if(j<v[k+1].p && i>v[k].p) return NULL;
if(j<v[k+1].p) return cauta(p->st,i,j);
if(i>v[k].p) return cauta(p->dr,i,j);
nod *a,*b;
a=cauta(p->st,i,v[k].p);
b=cauta(p->dr,v[k+1].p,j);
return adauga(a,b);
}
int poz(int i,int j)
{bila aux;
int i1[2]={0,1},j1[2]={-1,0},k=0;
while(i<j)
{if(v[i].p>v[j].p)
{aux=v[i];
v[i]=v[j];
v[j]=aux;
k++;
}
i+=i1[k%2];
j+=j1[k%2];
}
return i;
}
void sortare(int i,int j)
{if(i<j)
{int k=poz(i,j);
sortare(i,k);
sortare(k+1,j);
}
}
int main()
{fin>>n>>m;
int i,j,max,x,y,z;
nod *p;
for(i=1;i<=n;i++)
{fin>>v[i].p>>v[i].c;
if(v[i].c>cmax) cmax=v[i].c;
}
sortare(1,n);
r=construieste(1,n);
for(i=1;i<=m;i++)
{fin>>x>>y>>z;
if(x==0) schimba(r,y,z);
else
{p=cauta(r,y,z);
if(p==NULL) fout<<"0\n";
else
{max=0;
for(j=1;j<=cmax;j++)
if(p->c[j]>max) max=p->c[j];
fout<<max<<"\n";
}
delete p;
}
}
fin.close();
fout.close();
}