Cod sursa(job #496144)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 27 octombrie 2010 21:12:43
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <algorithm>
#define Nmax 100000+2
#define Cmax 64+2

using namespace std;

struct bila{ int x,cul; } v[Nmax];
int S[Nmax][Cmax];
int N,M;

inline int Maxim(int x,int y){ return x>y ? x:y; }
inline int cmp(bila a, bila b){
	return a.x < b.x;
}

inline int caut_bin(int l,int r,int x){
	int m,ret=0;
	while( l<=r ){
		m=l+(r-l)/2;
		if( v[m].x >= x ){
			ret=m;
			r=m-1;
		}
		else l=m+1;
	}
	return ret;
}
inline int caut_bin2(int l,int r,int x){
	int m,ret=0;
	while( l<=r ){
		m=l+(r-l)/2;
		if( v[m].x <= x ){
			ret=m;
			l=m+1;
		}
		else r=m-1;
	}
	return ret;
}
	
int main(){
	int i,j,op,a,b,poz,poz2,rez;
	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].x,&v[i].cul);
	sort(v+1,v+N+1,cmp);
	for(i=1;i<=N;++i)
		for(j=1;j<=64;++j)
			S[i][j]=S[i-1][j]+(v[i].cul==j);
	
	for(i=1;i<=M;++i){
		scanf("%d%d%d",&op,&a,&b);
		if( op == 0 ){
			poz=caut_bin(1,N,a);
			v[poz].x+=b;
		}
		else{
			poz=caut_bin(1,N,a);
			poz2=caut_bin2(1,N,b);
			rez=0;
			for(j=1;j<=64;++j)
				rez=Maxim(rez,S[poz2][j]-S[poz-1][j]);
			printf("%d\n",rez);
		}
	}
	
	fclose(stdin); fclose(stdout);
	return 0;
}