Cod sursa(job #164474)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 24 martie 2008 11:53:31
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <algorithm>
#include <string>
#define FIN "marbles.in"
#define FOUT "marbles.out"
#define MAX_N 100000
#define MAX_M 100000
#define MAX_C 64
using namespace std;
int n,m,lower_interval,upper_interval;
int a[MAX_N+1][MAX_C+1];
struct bila{
	int coord,cul;
} v[MAX_N+1];



bool fcmp(const bila &x, const bila &y){
	return (x.coord<y.coord);
}

void iofile(void){
	freopen(FIN,"rt",stdin);
	freopen(FOUT,"wt",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++){
		scanf("%d%d",&v[i].coord,&v[i].cul);
	}
	sort(v+1,v+n+1,fcmp);
	return ;
}

void preprocesare(void){
	for (int i=1;i<=n;i++){
		for (int j=1;j<=MAX_C;j++){	
			a[i][j]=a[i-1][j];
		}
		++a[i][v[i].cul];
	}
	return ;
}



int search_pos(int p,int u,int coord){
	if (p<=u){
		int m=(p+u)/2;
		if (v[m].coord==coord){return m;} else
		if (v[m].coord<coord){return search_pos(m+1,u,coord);} else
		{return search_pos(p,m-1,coord);}
	} else {return 0;}
}


void search_lower(int p,int u,int vl){
	if (p<=u){
		int m=(p+u)/2;
		if (v[m].coord<vl){lower_interval=m;search_lower(vl,m+1,u);} else{
		search_lower(vl,p,m-1);
	}}
}

void search_upper(int p,int u,int vl){
	if (p<=u){
		int m=(p+u)/2;
		if (v[m].coord>vl){upper_interval=m;search_upper(vl,p,m-1);} else{
			search_upper(vl,m+1,u);
		}
	}
}


void solve(void){
	int maxim,number,poz;
	for (int i=1,v1,v2,v3;i<=m;i++){
		scanf("%d%d%d",&v1,&v2,&v3);
		if (!v1){
			
			poz=search_pos(1,n,v2);
			v[poz].coord+=v3;
		} else{
			lower_interval=0;
			search_lower(1,n,v2);
			upper_interval=n+1;
			search_upper(1,n,v3);
			maxim=0;
			for (int color=1;i<=MAX_C;i++){
				number=a[upper_interval-1][color]-a[lower_interval][color];
				if (number>max){maxim=number;}
			}
			printf("%d\n",maxim);
		}
	}
	fclose(stdin);
	fclose(stdout);
	return ;
}


int main(void){
	iofile();
	preprocesare();
	solve();
	return 0;
}