Cod sursa(job #167807)

Utilizator razvi9Jurca Razvan razvi9 Data 30 martie 2008 10:14:33
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<cstdio>
#include<vector>
#include<algorithm>
int n,m,t,i,j,l,s[100001][65],max;
std::pair<int,int> a[100002];
int search(int st,int dr,int i,int u=0)
{
	if(st==dr)
		if(u==0)
			if(a[st].first<i) return st+1;
			else return st;
		else
			if(a[st].first>i) return st-1;
			else return st;
	if(st>dr)
		if(u==0)
			if(a[dr].first>=i) return dr;
			else
				if(a[st].first>=i) return st;
				else return st+1;
		else
			if(a[st].first<=i) return st;
			else
				if(a[dr].first<=i) return dr;
				else return dr-1;
	int mij=(st+dr)>>1;
	if(a[mij].first==i) return mij;
	if(a[mij].first>i) return search(st,mij-1,i,u);
	else return search(mij+1,dr,i,u);
}
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].first,&a[i].second);
	std::sort(&a[1],&a[n+1]);
	for(i=1;i<=n;i++){
		for(j=1;j<=64;j++)
			s[i][j]=s[i-1][j];
		s[i][a[i].second]++;}
	for(;m;m--){
		scanf("%d %d %d",&t,&i,&j);
		if(t==0)
			a[search(1,n,i)].first+=j;
		else{
			i=search(1,n,i,0)-1;
			j=search(1,n,j,1);
			max=0;
			for(l=1;l<=64;l++)
				if(s[j][l]-s[i][l]>max) max=s[j][l]-s[i][l];
			printf("%d\n",max);}}
	fclose(stdout);
	return 0;
}