#include <iostream>
#include <algorithm>
#include <string>
#define FIN "marbles.in"
#define FOUT "marbles.out"
#define MAX_N 100000
#define MAX_M 100000
#define MAX_C 64
using namespace std;
int n,m,lower_interval,upper_interval;
int a[MAX_N+1][MAX_C+1];
struct bila{
int coord,cul;
} v[MAX_N+1];
bool fcmp(const bila &x, const bila &y){
return (x.coord<y.coord);
}
void iofile(void){
freopen(FIN,"rt",stdin);
freopen(FOUT,"wt",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
scanf("%d%d",&v[i].coord,&v[i].cul);
}
sort(v+1,v+n+1,fcmp);
return ;
}
void preprocesare(void){
for (int i=1;i<=n;i++){
for (int j=1;j<=MAX_C;j++){
a[i][j]=a[i-1][j];
}
++a[i][v[i].cul];
}
return ;
}
int search_pos(int p,int u,int coord){
if (p<=u){
int m=(p+u)/2;
if (v[m].coord==coord){return m;} else
if (v[m].coord<coord){return search_pos(m+1,u,coord);} else
{return search_pos(p,m-1,coord);}
} else {return 0;}
}
void search_lower(int p,int u,int vl){
if (p<=u){
int m=(p+u)/2;
if (v[m].coord<vl){lower_interval=m;search_lower(m+1,u,vl);} else{
search_lower(p,m-1,vl);
}}
}
void search_upper(int p,int u,int vl){
if (p<=u){
int m=(p+u)/2;
if (v[m].coord>vl){upper_interval=m;search_upper(p,m-1,vl);} else{
search_upper(m+1,u,vl);
}
}
}
void solve(void){
int maxim,number,poz;
for (int i=1,v1,v2,v3;i<=m;i++){
scanf("%d%d%d",&v1,&v2,&v3);
if (!v1){
poz=search_pos(1,n,v2);
v[poz].coord+=v3;
} else{
lower_interval=0;
search_lower(1,n,v2);
upper_interval=n+1;
search_upper(1,n,v3);
maxim=0;
for (int color=1;color<=MAX_C;color++){
number=a[upper_interval-1][color]-a[lower_interval][color];
if (number>maxim){maxim=number;}
}
printf("%d\n",maxim);
}
}
fclose(stdin);
fclose(stdout);
return ;
}
int main(void){
iofile();
preprocesare();
solve();
return 0;
}