Cod sursa(job #1311615)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 8 ianuarie 2015 13:57:53
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <vector>

std::vector<unsigned> tree;
unsigned n;
unsigned maxbit;

void add(unsigned pos, unsigned val){
	while(pos<=n){
		tree[pos]+=val;
		pos+= pos&(-pos);
	}
}

unsigned get(unsigned pos){
	unsigned sum=0;

	while(pos>0){
		sum+=tree[pos];
		pos&=pos-1;
	}

	return sum;
}

int find(unsigned val){
	if(val==0) return -1;
	unsigned i=0,t;

	for(unsigned bitmask=maxbit;bitmask;bitmask>>=1){
		t=i+bitmask;
		if(t<=n&&val>=tree[t]){
			val-=tree[t];
			i=t;
			if(val==0) return t;
		}

	}
	if(val==0) return i;
	return -1;
}

int main(){
	std::ifstream fin("aib.in");
	std::ofstream fout("aib.out");

	unsigned m;
	fin>>n>>m;

	tree.resize(n+1,0);

	maxbit=1;
	while(n>=maxbit) maxbit<<=1;
	maxbit>>=1;

	for(unsigned i=1;i<=n;++i){
		unsigned x; fin>>x;
		add(i,x);
	}

	for(unsigned i=0;i<m;++i){
		char c; unsigned a,b;
		fin>>c;
		switch(c){
			case '0': fin>>a>>b; add(a,b); break;
			case '1': fin>>a>>b; fout<<get(b)-get(a-1)<<'\n'; break;
			case '2': fin>>a; fout<<find(a)<<'\n'; break;
		}
	}
}