Cod sursa(job #976946)

Utilizator TibixbAndrei Tiberiu Tibixb Data 24 iulie 2013 13:25:00
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<cstdio>
#include <fstream>
#include<string.h>
#include <algorithm>

using namespace std;
int i, j, a[67][100003], aux, n, m, p1, p2, x, y, maxim, mi = 65, mx, st, dr, mid;
struct bila {
	int p;
	int c;
};

bila b[100003];
int cb1(int x) {//a cata bila este cea de la abscisa x
	st = 1; dr = n;
	while (st<=dr) {
		mid = (st+dr)>>1;
		if (b[mid].p == x)
			return mid;
		if (b[mid].p < x)
			st = mid+1;
		else
			dr = mid-1;
	}
	return 0;
}


int cb2(int x){
	st=1; dr=n;
	while(st<=dr){
		mid = (st+dr)>>1;
		if(b[mid].p<=x)
			st = mid+1;
		else
			dr = mid-1;
	}
	return dr;
}	

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

FILE *fin=fopen("marbles.in", "r");
//FILE *fout=fopen("marbles.out", "w");
ofstream fout("marbles.out");
//int cb2(int x) //determina prima bila aflata pe o pozitie <= cu x

int main(){
	fscanf(fin,"%d%d",&n, &m);
	for(i=1; i<=n; i++){
		fscanf(fin,"%d%d", &b[i].p, &b[i].c);
		if (b[i].c > mx)
			mx = b[i].c;
		if (b[i].c < mi)
			mi = b[i].c;
		//		a[c[i]][i]=a[c[i]][i-1]+1;
		
	}
	
	sort(b+1,b+n+1,cmp);
	
	for (j=mi;j<=mx;j++)
		for (i=1;i<=n;i++)
			if (j == b[i].c)
				a[j][i] = a[j][i-1]+1;
			else
				a[j][i] = a[j][i-1];
	
	for(i=1; i<=m; i++){
		fscanf(fin,"%d%d%d", &aux, &p1, &p2);
		if (aux == 0) {
			j = cb1(p1);
			b[j].p += p2;
		}
		else{
			x = cb2(p1-1);
			y = cb2(p2);
			maxim = 0;
			for (j=mi;j<=mx;j++)
				if (a[j][y] - a[j][x] > maxim)
					maxim = a[j][y] - a[j][x];
			//fprintf(fout,"%d\n",maxim);
			fout<<maxim<<"\n";
			
		}
	}
	return 0;
}