Cod sursa(job #168823)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 31 martie 2008 20:00:00
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <stdio.h>
#include <assert.h>
#include <algorithm>
#include <vector>

using namespace std;

#define f first
#define s second
#define mp make_pair
#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define nmax 100111
#define pt(i) (1<<(i))

int n,m,A[nmax][64],sol;
pair <int,int> P[nmax];

int find(int x)
{
	int j=0,i;
	for(i=16;i>=0;--i)
		if(j+pt(i)<n && P[j+pt(i)].f<=x)
			j+=pt(i);
	return j;
}

int main()
{
	int ii,i,j,c,t;
	freopen("marbles.in","r",stdin);
	freopen("marbles.out","w",stdout);
	scanf("%d %d",&n,&m);
	assert(1<=n && n <=100000);
	assert(1<=n && m <=100000);
	FOR(i,0,n)
	{
		scanf("%d %d",&P[i].f,&P[i].s);
		assert(1<= P[i].s && P[i].s<=64);
		P[i].s--;
	}
	P[n]=mp(0,64); n++;
	sort(P,P+n);
	P[n]=mp(100000,64); n++;
	FOR(i,1,n-1) 
	{
		memcpy(A[i],A[i-1],sizeof(A[i]));
		A[i][P[i].s]++;
	}

	FOR(ii,0,m)
	{
		scanf("%d %d %d",&c,&i,&j);
		if(c)
		{
			i=find(i-1); j=find(j); sol=0;
			FOR(t,0,64)
				if(sol<A[j][t]-A[i][t])
					sol=A[j][t]-A[i][t];
			printf("%d\n",sol);
			continue;
		}
		P[find(i)].f += j;
	}
	return 0;
}