Cod sursa(job #445019)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 22 aprilie 2010 14:58:36
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<algorithm>
#define Nmax 100010
using namespace std;

int i,j,n,m,op,a,b,S[70][Nmax];
struct bila { int poz,cul;} v[Nmax];

int cmp(bila a, bila b)
{
	return a.poz<b.poz;
}

void update (int p,int add)
{
	int s=1,d=n,m;
	
	for(m=(s+d)>>1; s<=d; m=(s+d)>>1)
	{
		if(v[m].poz==p) {v[m].poz+=add; return ;}
		if(v[m].poz<p) s=m+1;
			else d=m-1;
	}
}

int query (int a, int b)
{
	int s=1,d=n,m,i=0,Max=0;
	
	for(m=(s+d)>>1; s<=d; m=(s+d)>>1)
		if(v[m].poz>=a) {i=m; d=m-1;}
			else s=m+1;
	if(!i) return 0;

	a=i-1; i=0; s=1; d=n;
	
	for(m=(s+d)>>1; s<=d; m=(s+d)>>1)
		if(v[m].poz<=b) {i=m; s=m+1;}
			else d=m-1;
	if(!i) return 0;

	b=i;

	for(i=1;i<=64;i++)
		if(S[i][b]-S[i][a]>Max) Max=S[i][b]-S[i][a];
	return Max;
}
	
	

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",&v[i].poz,&v[i].cul);
	
	
	sort(v+1,v+n+1,cmp);
	
	for(i=1;i<=n;i++)
	{
		S[v[i].cul][i]=1;
		for(j=1;j<=64;j++)
			S[j][i]+=S[j][i-1];
	}
	
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&op,&a,&b);
		
		if(!op) update(a,b);
		else printf("%d\n",query(a,b));
	}
	
	return 0;
}