Cod sursa(job #317362)

Utilizator Mishu91Andrei Misarca Mishu91 Data 23 mai 2009 13:33:10
Problema Marbles Scor 100
Compilator cpp Status done
Runda Pregatire clasa a 9a Marime 1.6 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define MAX_N 100005
#define x first
#define c second

int N, M, logN;
int S[MAX_N][65];

pair <int, int> A[MAX_N];


void update(int x, int y)
{
	pair <int, int> a  = make_pair(x, 0);
	int poz = lower_bound(A+1, A+N+1, a) - A;
	A[poz].x += y;
#ifdef _HOME_
	fprintf(stderr, "%d\n", poz);
	fprintf(stderr, "%d\n", A[poz].x);
#endif
}

void query(int x, int y)
{
	int i, lg;
	for(i = 0, lg = logN; lg; lg >>= 1)
		if((i + lg <= N) && (A[i+lg].x < x))
			i += lg;
		
	int poz1 = i;
	
	for(i = 1, lg = logN; lg; lg >>= 1)
		if((i + lg <= N) && (A[i+lg].x <= y))
			i += lg;
	int poz2 = i, C[65];

#ifdef _HOME_
	fprintf(stderr, "%d ", poz1);
	fprintf(stderr, "%d\n", poz2);
#endif
	
	for(int j = 1; j <= 64; ++j)
		C[j] = S[poz2][j] - S[poz1][j];
		
	int sol = 0;
	for(int i = 1; i <= 64; ++i)
		sol = max(sol, C[i]);
	printf("%d\n",sol);
}

int main()
{
	freopen("marbles.in","rt",stdin);
	freopen("marbles.out","wt",stdout);
	
	scanf("%d %d",&N, &M);
	
	for(int i = 1; i <= N; ++i)
	{
		int x, c;
		scanf("%d %d", &x, &c);
		A[i] = make_pair(x, c);
	}
	
	sort(A+1, A+N+1);
	

	
	for(logN = 1; logN < N; logN <<= 1);
	
	for(int i = 1; i <= N; ++i)
	{
		memcpy(S[i], S[i-1], sizeof S[i]);
		++S[i][A[i].c];
	}
	
#ifdef _HOME_
	fprintf(stderr, "%d\n",N);
	for(int i = 1; i <= N; ++i)
		fprintf(stderr, "%d %d\n", A[i].x, A[i].c);
	for(int i = 1; i <= N; ++i)
		fprintf(stderr, "%d %d %d\n", S[i][1], S[i][2], S[i][3]);
	fprintf(stderr,"--------------\n");
#endif

	while(M--)
	{
		int x, y, t;
		scanf("%d %d %d",&t, &x, &y);
		if(!t)
			update(x, y);
		else 
			query(x, y);
	}
}