Pagini recente » Cod sursa (job #2759182) | Cod sursa (job #689276) | Cod sursa (job #2770512) | Cod sursa (job #1062510) | Cod sursa (job #164383)
Cod sursa(job #164383)
#include <stdio.h>
int max,p1,p2,x,y,p,q,i,j,k,n,m,r;
int a[100010][2],b[100010][2];
int v[100010][65];
void inter(int p, int q)
{
int r=(p+q)/2,k=0,x=p,y=r+1,i;
while (x<=r && y<=q)
{
k++;
if (a[x][0]<a[y][0])
{
b[k][0]=a[x][0];
b[k][1]=a[x][1];
x++;
}
else
{
b[k][0]=a[y][0];
b[k][1]=a[y][1];
y++;
}
}
while (x<=r)
{
k++;
b[k][0]=a[x][0];
b[k][1]=a[x][1];
x++;
}
while (y<=q)
{
k++;
b[k][0]=a[y][0];
b[k][1]=a[y][1];
y++;
}
k=0;
for (i=p; i<=q; i++)
{
k++;
a[i][0]=b[k][0];
a[i][1]=b[k][1];
}
}
void merge(int p, int q)
{
int r=(p+q)/2;
if (p==q) return;
merge(p,r);
merge(r+1,q);
inter(p,q);
}
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",&a[i][0],&a[i][1]);
merge(1,n);
for (i=1; i<=n; i++)
{
for (j=1; j<=64; j++)
v[i][j]=v[i-1][j];
v[i][a[i][1]]++;
}
for (i=1; i<=m; i++)
{
scanf("%d %d %d",&k,&x,&y);
if (k==0)
{
p=0;q=n+1;
while (p+1<q)
{
r=(p+q)/2;
if (a[r][0]>x) q=r;
else if (a[r][0]<x)p=r;
else break;
}
a[r][0]=a[r][0]+y;
}
else
{
if (x>y)
{
p=x;x=y;y=p;
}
p1=1;p=0;q=n+1;
while (p+1<q)
{
r=(p+q)/2;
if (a[r][0]>=x)
{
q=r;
p1=r;
}
else if (a[r][0]<x) p=r;
}
p2=n;p=0;q=n+1;
while (p+1<q)
{
r=(p+q)/2;
if (a[r][0]<=y)
{
p=r;
p2=r;
}
else if (a[r][0]>y) q=r;
}
p1--;max=0;
for (j=1; j<=64; j++)
if (v[p2][j]-v[p1][j]>max) max=v[p2][j]-v[p1][j];
printf("%d\n",max);
}
}
return 0;
}