Pagini recente » Cod sursa (job #30457) | Cod sursa (job #564272) | Cod sursa (job #156437) | Cod sursa (job #1580638) | Cod sursa (job #317609)
Cod sursa(job #317609)
#include<cstdio>
#include<stdlib.h>
#define N 100001
int *a[65],n,m,v[N];
struct milk{int b,c;}aux[N];
int compar(const void *p,const void*q)
{
int pp=*(int*)p,qq=*(int*)q;
if (pp<qq) return -1;
if (pp>qq) return 1;
return 0;
}
int caut2(int x,int i)
{
int p,u,m;
p=1;
u=v[i];
while(p!=u)//cat timp intervalul in care caut are mai mult de un element
{
m=(p+u)/2;
if(x<=a[i][m])
u=m;
else
p=m+1;
}
/*if(a[i][p]>x)
return p-1;
if (a[i][p]==x)
return p;
return -1;*/
return p;
}
int caut1(int x,int i)
{
int p,u,m;
p=1;
u=v[i];
while(p!=u)//cat timp intervalul in care caut are mai mult de un element
{
m=(p+u)/2;
if(x<=a[i][m])
u=m;
else
p=m+1;
}
/*if(a[i][p]<x)
return p-1;
if (a[i][p]==x)
return p;
return -1;
*/
return p;
}
int caut0(int x)
{
int p,u,m;
p=1;
u=n;
while(p!=u)//cat timp intervalul in care caut are mai mult de un element
{
m=(p+u)/2;
if(x<=aux[m].b)
u=m;
else
p=m+1;
}
if(aux[p].b==x)
return p;
return -1;
}
void citire()
{
freopen("marbles.in","r",stdin);
freopen("marbles.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1; i<=n; ++i)
{
int x,y;
scanf("%d%d",&x,&y);
aux[i].b=x;
aux[i].c=y;
if (!v[y])
a[y]=new int [N];
a[y][++v[y]]=x;
}
for (int i=1; i<=64; ++i)
if (v[i])
qsort(1+a[i],v[i],sizeof(a[i][0]),compar);
for (int i=1; i<=m; ++i)
{
int a1,x,y;
scanf("%d%d%d",&a1,&x,&y);
if (a1)
{
int max=0;
for (int j=1; j<=64; ++j)
if (v[j])
{
int x1=caut2(x,j),x2=caut1(y,j),nrel;
if (a[j][x1]<x)++x1;
if (a[j][x2]>y)--x2;
nrel=x2-x1+1;
if (max<nrel) max=nrel;
}
printf("%d\n",max);
}
else
{
int g1=caut0(x);
if (g1==-1) continue;
int g=aux[g1].c;
a[g][g1]=x+y;
aux[g1].b=x+y;
qsort(1+a[g],v[g],sizeof(a[g][0]),compar);
}
}
}
void afis()
{
for (int i=1; i<=64; ++i)
{
if (v[i])
{
for (int j=1; j<=v[i]; ++j)
printf("%d ",a[i][j]);
printf("\n");
}
}
}
int main()
{
citire();
//afis();
return 0;
}