Cod sursa(job #431003)

Utilizator nandoLicker Nandor nando Data 31 martie 2010 15:47:45
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>

#define MAXN 100005

FILE* fin=fopen("aib.in","r");
FILE* fout=fopen("aib.out","w");

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;
	fscanf(fin,"%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		fscanf(fin,"%d ",&d);
		update(i,d);
	}

	for(int i=0;i<m;i++){
		fscanf(fin,"%d %d",&op,&a);
		switch(op){
			case 0:
				fscanf(fin,"%d ",&b);
				update(a,b);
				break;
			case 1:
				fscanf(fin,"%d ",&b);
				fprintf(fout,"%d\n",query(b)-query(a-1));
				break;
			case 2:
				fprintf(fout,"%d\n",search(a));
				break;
		}
	}

	fclose(fin);
	fclose(fout);
	return 0;
}