Cod sursa(job #445014)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 22 aprilie 2010 14:49:55
Problema Marbles Scor 60
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,c;

struct sir { int poz,cul[70];} v[Nmax];

int cmp (sir a, sir 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(v[b].cul[i]-v[a].cul[i]>Max) Max=v[b].cul[i]-v[a].cul[i];
	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,&c);
		v[i].cul[c]=1;
	}
	
	sort(v+1,v+n+1,cmp);
	
	for(i=2;i<=n;i++)
		for(j=1;j<=64;j++)
			v[i].cul[j]+=v[i-1].cul[j];
	
	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;
}