Cod sursa(job #972676)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 12 iulie 2013 13:44:31
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<fstream>
#include<algorithm>

#define max_n 100010

using namespace std;

ifstream f("marbles.in");
ofstream g("marbles.out");

int n , m , num_c;
int V[65][max_n];

struct bila{
	int p , c;
};

bila B[max_n];


void read(){
	
	f>>n>>m;
	
	for( int i = 1 ; i <= n ; i++ ){
		f>>B[i].p>>B[i].c;
		if(B[i].c > num_c) num_c = B[i].c;
	}
	
}

int search( int v ){
	
	int i , s;
	for( s = 1 ; s < n ; s <<= 1 );
	for( i = 0 ; s ; s >>= 1 )
		if( i + s < n && B[i+s].p <= v )
			i += s;
	return i;
	
}

void solve(){
	
	int op , a , b , nr , ind , ind1 , ind2 , maxim;
	
	for( int i = 1 ; i <= m ; i++ ){
		
		f>>op>>a>>b;
		
		switch( op ){
		case 0:
			ind = search(a);
			B[ind].p += b;
			break;
		case 1:
			ind1 = search(a);
			ind2 = search(b);
			
			maxim = -1;
			
			for( int j = 1 ; j <= num_c ; j++ ){
				
				nr = V[j][ind2] - V[j][ind1];
				
				if( B[ind1].p == a && j == B[ind1].c )
					nr++;
				
				if( nr > maxim )
					maxim = nr;
				
			}
			
			g<<maxim<<"\n";
			
			break;
		}
		
	}
	
}

int cmp( bila a , bila b ){
	return a.p < b.p;
}

int main(){
	
	read();
	
	sort( B+1 , B+n+1 , cmp );
	
	for( int j , i = 1 ; i <= num_c ; i++ )
		for( j = 1 ; j <= n ; j++ ){
			V[i][j] = V[i][j-1];
			if( B[j].c == i ) V[i][j]++;
		}
	
	solve();
	
	return 0;
}