#include <stdio.h>
#define nmax 100005
int s, N, M, c, i, t, a, b;
int X[nmax], Y[nmax], K[nmax], C[nmax], cate[nmax][66];
void msort(int l, int r)
{
if (l >= r)
return;
int m = (l+r)>>1, i, j, k;
for (i = k = l, j = m+1; i <= m && j <= r; ++k)
{
if (X[i] < X[j])
{
Y[k] = X[i];
K[k] = C[i];
++i;
}
else
{
Y[k] = X[j];
K[k] = C[j];
++j;
}
}
for (; i <= m; ++i, ++k)
{
Y[k] = X[i];
K[k] = C[k];
}
for (; j <= r; ++j, ++k)
{
Y[k] = X[k];
K[k] = C[k];
}
for (k = l; k <= r; ++k)
{
X[k] = Y[k];
C[k] = K[k];
}
}
int b_match(int c, int l, int r)
{
if (l > r)
return 0;
int m = (l+r)>>1;
if (X[m] < c)
return b_match(c, m+1, r);
if (X[m] > c)
return b_match(c, l, m-1);
return m;
}
int b_right(int p, int l, int r)
{
if (l > r)
return s;
int m = (l+r)>>1;
if (p < X[m])
b_right(p, l, m-1);
else
{
s = m;
b_right(p, m+1, r);
}
return s;
}
void muta(int i, int j)
{
X[b_match(i, 1, N)] = i+j;
}
int query(int a, int b)
{
int l = b_right(a-1, 1, N);
int r = b_right(b, 1, N);
int m = 0;
for (c = 1; c <= 64; ++c)
if (cate[r][c] - cate[l][c] > m)
m = cate[r][c] - cate[l][c];
return m;
}
int main()
{
freopen("marbles.in", "r", stdin);
freopen("marbles.out", "w", stdout);
scanf("%d%d", &N, &M);
for (i = 1; i <= N; ++i)
scanf("%d%d", &X[i], &C[i]);
// sortez dupa coordonata
msort(1, N);
for (i = 1; i <= N; ++i)
for (c = 1; c <= 64; ++c)
cate[i][c] = cate[i-1][c] + (C[i]==c);
while (M--)
{
scanf("%d%d%d", &t, &a, &b);
if (t == 0)
muta(a, b);
else
printf("%d\n", query(a, b));
}
return 0;
}