Cod sursa(job #647678)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 11 decembrie 2011 19:15:05
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include<fstream>
#define NMAX 100100
using namespace std;
int n,aib[NMAX];
int search(int val) {
	int step,i;
	for(step=1;step<n;step<<=1);
	
	for(i=0;step;step>>=1)
		if(i+step<=n)
			if(val>=aib[i+step]) {
				i+=step;
				val-=aib[i];
				if(!val)
					return i;
				}
	return -1;
}
int query(int nod) {
	int sol=0;
	while(nod>0) {
		sol+=aib[nod];
		nod-=(nod&-nod);
		}
	return sol;
}
void update(int nod,int val) {
	while(nod<=n) {
		aib[nod]+=val;
		nod+=(nod&-nod);
		}
}
int main() {
	int i,tip,x,y,m;
	ifstream in("aib.in");
	ofstream out("aib.out");
	in>>n>>m;
	for(i=1;i<=n;i++) {
		in>>x;
		update(i,x);
		}
	while(m--) {
		in>>tip>>x;
		if(tip!=2)
			in>>y;
		switch(tip) {
			case 0:update(x,y);break;
			case 1:out<<query(y)-query(x-1)<<'\n';break;
			case 2:out<<search(x)<<'\n';break;
			}
		}
	in.close();
	out.close();
	return 0;
}