Cod sursa(job #761490)

Utilizator harababurelPuscas Sergiu harababurel Data 26 iunie 2012 11:18:26
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#define zeros(x) ( (x ^ (x - 1)) & x )
using namespace std;

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

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


int main() {
	ifstream f("aib.in");
	ofstream g("aib.out");
	
	f>>n>>m;
	
	aib[0]=0; v[0]=0;
	for(i=1; i<=n; i++) aib[i]=0; 	//initializare cu 0
	for(i=1; i<=n; i++) { f>>v[i]; add(i, v[i]); }	//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;
}