Cod sursa(job #976937)

Utilizator TibixbAndrei Tiberiu Tibixb Data 24 iulie 2013 13:11:57
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<cstdio>
#include<string.h>
using namespace std;
int i, j, c[100003], a[67][100003], aux, n, m, p1, p2, x, y, maxim, p[100003];

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


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

FILE *fin=fopen("marbles.in", "r");
FILE *fout=fopen("marbles.out", "w");

//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", &p[i], &c[i]);
//		a[c[i]][i]=a[c[i]][i-1]+1;
		
	}
	for (j=1;j<=64;j++)
		for (i=1;i<=n;i++)
			if (j == c[i])
				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);
			p[j] += p2;
		}
		else{
			x = cb2(p1-1);
			y = cb2(p2);
			maxim = 0;
			for (j=1;j<=64;j++)
				if (a[j][y] - a[j][x] > maxim)
					maxim = a[j][y] - a[j][x];
			fprintf(fout,"%d\n",maxim);
		}
	}
return 0;
}