#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX_N 100005
#define x first
#define c second
int N, M, logN;
int S[MAX_N][65];
pair <int, int> A[MAX_N];
void update(int x, int y)
{
pair <int, int> a = make_pair(x, 0);
int poz = lower_bound(A+1, A+N+1, a) - A;
A[poz].x += y;
#ifdef _HOME_
fprintf(stderr, "%d\n", poz);
fprintf(stderr, "%d\n", A[poz].x);
#endif
}
void query(int x, int y)
{
int i, lg;
for(i = 0, lg = logN; lg; lg >>= 1)
if((i + lg <= N) && (A[i+lg].x < x))
i += lg;
int poz1 = i;
for(i = 1, lg = logN; lg; lg >>= 1)
if((i + lg <= N) && (A[i+lg].x <= y))
i += lg;
int poz2 = i, C[65];
#ifdef _HOME_
fprintf(stderr, "%d ", poz1);
fprintf(stderr, "%d\n", poz2);
#endif
for(int j = 1; j <= 64; ++j)
C[j] = S[poz2][j] - S[poz1][j];
int sol = 0;
for(int i = 1; i <= 64; ++i)
sol = max(sol, C[i]);
printf("%d\n",sol);
}
int main()
{
freopen("marbles.in","rt",stdin);
freopen("marbles.out","wt",stdout);
scanf("%d %d",&N, &M);
for(int i = 1; i <= N; ++i)
{
int x, c;
scanf("%d %d", &x, &c);
A[i] = make_pair(x, c);
}
sort(A+1, A+N+1);
for(logN = 1; logN < N; logN <<= 1);
for(int i = 1; i <= N; ++i)
{
memcpy(S[i], S[i-1], sizeof S[i]);
++S[i][A[i].c];
}
#ifdef _HOME_
fprintf(stderr, "%d\n",N);
for(int i = 1; i <= N; ++i)
fprintf(stderr, "%d %d\n", A[i].x, A[i].c);
for(int i = 1; i <= N; ++i)
fprintf(stderr, "%d %d %d\n", S[i][1], S[i][2], S[i][3]);
fprintf(stderr,"--------------\n");
#endif
while(M--)
{
int x, y, t;
scanf("%d %d %d",&t, &x, &y);
if(!t)
update(x, y);
else
query(x, y);
}
}