Cod sursa(job #762148)

Utilizator harababurelPuscas Sergiu harababurel Data 28 iunie 2012 22:28:30
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
using namespace std;

int n, m, i, j, a, b, op, t, begin, end, mid, v;
int aib[100001];
 
void add(int x, int quantity) {
    int i=x;
    while(i<=n) {
        aib[i] += quantity;
		i+= i & (-i);
	}
}

int compute(int x) {
    int i=x, ret = 0;
    while(i>0) {
        ret += aib[i];
		i-= i & (-i);
	}
    return ret;
}


int main() {
	ifstream f("aib.in");
	ofstream g("aib.out");
	
	f>>n>>m;
	
	aib[0]=0;
	memset(aib, 0, sizeof(aib));	//initializez cu 0	
	for(i=1; i<=n; i++) { f>>v; add(i, v); }	//bag primele valori
	
	for(t=1; t<=m; t++) {
		f>>op;
		if(op==0) {		//adaug b pe pozitia a
			f>>a>>b;
			add(a,b);
		}
		if(op==1) {		//calculez suma din [a,b] cu formula compute(b)-compute(a-1)
			f>>a>>b;
			g<<compute(b)-compute(a-1)<<"\n";
		}
		if(op==2) {		//caut binar o pozitie i pentru care compute(i) = a
			f>>a;
			begin=0;
			end=n+1;
			while(end-begin>1) {
				mid = begin + (end-begin)/2;
				if(compute(mid) > a) end=mid;
				else begin=mid;
			}
			if( compute(begin) == a ) g<<begin<<"\n";
			else if( compute(end) == a ) g<<end<<"\n"; 
			else if( compute(mid) == a ) g<<mid<<"\n";
			else g<<"-1\n";
		
		}
	}
   
	f.close();
	g.close();
	return 0;
}