Cod sursa(job #605226)

Utilizator theodora_maneaManea Theodora Maria theodora_manea Data 27 iulie 2011 11:27:52
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>

#define max_n 1<<18
using namespace std;

int i,n,m,c,a,b,s,k,x;
int v[1<<18];

ifstream in("aib.in");
ofstream out("aib.out");

void adauga(int nod, int st, int dr, int poz,int x) {
	int p;
	if (poz>=st && poz<=dr) {
		v[nod]+=x;
		p=(st+dr)/2;
		if (poz==st && poz==dr) return;
		if (p>=poz) adauga(nod*2,st,p,poz,x);
		else adauga(nod*2+1,p+1,dr,poz,x);
	}
}
		

void suma(int nod,int st, int dr, int a, int b) {
	int p;
	if (a<=st && dr<=b) 
		s+=v[nod];
	else {
		p=(st+dr)/2;
		if (a<=p) suma(2*nod,st,p,a,b);
		if (b>p) suma(2*nod+1,p+1,dr,a,b);
	}
}
		
int caut_binar(int st,int dr) {
	int mij;
	while (st<=dr) {
		mij=(st+dr)/2;
		s=0;
		suma(1,1,n,1,mij);
		if (s==a) return mij;
		if (s>a) dr=mij-1;
		else st=mij+1;
	}
	return -1;
}

int main () {
	in >> n >> m;
	for (i=1; i<=n; i++) {
		in >> x;
		adauga(1,1,n,i,x);
	}
	
	for (i=1; i<=m; i++) {
		in >> c;
		if (c==0) {
			in >> a >> b;
			adauga(1,1,n,a,b);
		}
		else
			if (c==1) {
				in >> a >> b;
				s=0;
				suma(1,1,n,a,b);
				out << s << '\n';
			}
			else {
				in >> a;
				k=caut_binar(1,n);
			    out << k << '\n';			
			}
	}
	return 0;
}