Cod sursa(job #469596)

Utilizator bugyBogdan Vlad bugy Data 8 iulie 2010 13:47:34
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<stdio.h>
using namespace std;
#define dim 100005


int n,m,X[dim],max,i,j,x,mij,C[dim],ii,a,b,MAX,sc;
short int S[65][dim],p;


int caut_bin (int in, int sf)
{
	mij=(in+sf)/2;   
	   
		if(in>sf) return sf;  
	
	if(x==X[mij]) return mij;
		
	if(x>X[mij])
			return  caut_bin(mij+1,sf); 
	else	
			return caut_bin(in,mij-1);

	
}


   
void quicksort(int inceput,int ultimul)      
{int i,j,temp,aux; 
  i=inceput;      
  j=ultimul;      
  temp=X[(i+j)/2];      
 do     
   {while(X[i]<temp)      i++;      
    while(X[j]>temp)      j--;      
    if(i<j)      
     {aux=X[i]; X[i]=X[j]; X[j]=aux; 	}      
    if(i<=j)      
     {j=j-1;      
      i=i+1;      
     }      
   }while(i<=j);      
   if(inceput<j)    quicksort(inceput,j);      
   if(i<ultimul)    quicksort(i,ultimul);      
   
}  




int main()
{
	FILE *f=fopen("marbles.in","r"), *g=fopen("marbles.out","w");
fscanf(f,"%d%d",&n,&m);

for(i=1;i<=n;i++)
	{
		fscanf(f,"%d %d",&X[i],&C[i]);
		if(X[i]>max) max=X[i];
		S[C[i]][X[i]]=1;
	}
for(i=1;i<=64;i++)
	for(j=1;j<=max;j++)
		S[i][j]+=S[i][j-1];
		
quicksort(1,n);

for(int t=1;t<=m;t++)
{
fscanf(f,"%hd %d %d",&p,&i,&j);
if(p==0)
	{x=i;

	x=caut_bin(1,n);
	
	X[x]+=j;
	
	x=C[x];
	
	if(j>0)
		{
		for(ii=i;ii<i+j;i++)
			S[x][ii]--;
	
		}
	else if(j<0)
		{	
		for(ii=i+j;ii<i;ii++)
			S[x][ii]++;
		}
	
	}
else if(p==1)
{
	MAX=0;
	x=i;
		a=caut_bin(1,n);
	if(X[a]<i)
		a++;
		
	x=j;
		b=caut_bin(1,n);
		
		
	for(ii=1;ii<=64;ii++)
	{		
		sc=S[ii][X[b]]-S[ii][X[a]-1];
		if(sc>MAX)
			MAX=sc;		
	}
	fprintf(g,"%d\n",MAX);

}
	


}

fclose(f);
fclose(g);


return 0;}