Cod sursa(job #431008)

Utilizator nandoLicker Nandor nando Data 31 martie 2010 15:50:48
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>

using namespace std;

#define MAXN 100005

fstream fin("aib.in",ios::in);
fstream fout("aib.out",ios::out);

int c[MAXN],n,m;

void update(int ind,int val){
	int poz=0;
	while(ind<=n){
		c[ind]+=val;
		while(!(ind&(1<<poz))){
			poz++;
		}
		ind+=(1<<poz);
		poz++;
	}
}
int query(int ind){
	int s=0,poz=0;
	while(ind>0){
		s+=c[ind];
		while(!(ind&(1<<poz))){
			poz++;
		}
		ind-=(1<<poz);
		poz++;
	}
	return s;
}

int search(int sum){
	int pos=n+1,end=n+1,beg=0,mdl=n,s;
	s=query(mdl);
	if(s==sum){
		pos=n;
	}
	while(mdl){
		mdl=beg+((end-beg)>>1);
		s=query(mdl);
		if(s>sum){
			if(end>mdl){
				end=mdl;
			}
			mdl--;
		}else if(s==sum){
			pos=((pos<mdl)?pos:mdl);
			end=mdl;
			mdl--;
		}else{
			if(beg<mdl){
				beg=mdl;
			}
			mdl++;
		}
		if(mdl<=beg)break;
		if(mdl>=end)break;
	}
	return ((pos==n+1)?-1:pos);
}

int main(){
	int op,a,b,d;
	fin>>n>>m;
	for(int i=1;i<=n;i++){
		fin>>d;
		update(i,d);
	}

	for(int i=0;i<m;i++){
		fin>>op>>a;
		switch(op){
			case 0:
				fin>>b;
				update(a,b);
				break;
			case 1:
				fin>>b;
				fout<<query(b)-query(a-1);
				break;
			case 2:
				fout<<search(a);
				break;
		}
	}

	return 0;
}