Cod sursa(job #204370)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 23 august 2008 11:05:35
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
using namespace std;

#include <cstdio>
#include <algorithm>
#include <vector>
#include <utility>

#define IN "marbles.in"
#define OUT "marbles.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<17
#define CC 1<<6
#define f first
#define s second

int k(-1),N,M;
vector< pair<int,int> > V(N_MAX); 
char buffer[1<<22];
int MX[(CC)+1],S[(CC)+1][N_MAX],X[N_MAX];
int CCM,CCm(65),CONST_STEP;

void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d%d\n", &N,&M);
	fread(buffer,1,1<<22,stdin);
	
	V.resize(N);
	FOR(i,1,N)
	{
		for(;buffer[++k] != ' ';)
			V[i].f = V[i].f * 10 + buffer[k] - '0';
		for(;buffer[++k] != '\n';)
			V[i].s = V[i].s * 10 + buffer[k] - '0';
		CCm = min(CCm,V[i].s);
		CCM = max(CCM,V[i].s);
	}	
	sort(V.begin(), V.end());	
}	

inline int find(int val)
{
	int m,step = CONST_STEP;
    for(m = 1; step; step >>= 1)
        if( m + step <= N && X[m + step - 1] < val )
			m += step;
	return m;	
}


void solve()
{
	bool semn,type;
	int x,y;
	int pozx,pozy;
	
	for(CONST_STEP = 1; CONST_STEP <= N; CONST_STEP <<= 1);
	
	FOR(i,1,N)
		FOR(ci,CCm,CCM)
			S[ci][i] = (V[i].s == ci ? S[ci][i-1] + 1 : S[ci][i-1]);
	
	FOR(i,1,N)
		X[i] = V[i].f;
	vector< pair<int,int> > ().swap(V);	
	
	FOR(i,1,M)
	{
		x = y = semn = 0;
		for(;buffer[++k] != ' ';)
			type = buffer[k] - '0';
		for(;buffer[++k] != ' ';)
			x = x * 10 + buffer[k] - '0';
		for(;buffer[++k] != '\n' && buffer[k] != '\0';)
		{
			if(buffer[k] == '-')
				++k,semn = 1;
			y = y * 10 + buffer[k] - '0';
		}
		if(semn)
			y *= -1;
		
		if(type)
		{
			int best(0);
			pozx = find(x);
			if(X[pozx] < x)
				++pozx;
			pozy = find(y);
			if(X[pozy] > y)
				--pozy;
			--pozx;
			
			FOR(ci,CCm,CCM)
				if(S[ci][pozy] - S[ci][pozx] > best)
					best =  S[ci][pozy] - S[ci][pozx];
			printf("%d\n", best);	
		}	
		else
		{
			pozx = find(x);
			X[pozx] = x+y;
		}	
	}
	
}	

int main()
{
	scan();
	solve();
	return 0;
}