Cod sursa(job #317609)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 24 mai 2009 10:40:35
Problema Marbles Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#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;
}