Cod sursa(job #370149)

Utilizator titusuTitus C titusu Data 30 noiembrie 2009 13:07:15
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
using namespace std;
#include <cstdio>

int tree[100010],n;
FILE *f=fopen("aib.in","r");   
FILE *g=fopen("aib.out","w");

void Add(int poz, int valoare){
	int tmp,q;
	while(poz<=n){
		tree[poz] += valoare;
		tmp=poz;q=1;
		while(!(tmp&1)) q<<=1, tmp >>=1;
		poz+=q;
	}
	/*
	for(int i=1;i<=n;i++)
		printf("%d ",tree[i]);
	printf("\n");
	*/
}

int Sum(int poz){
	int s=0,tmp,q;
	while(poz){
		s+=tree[poz];
		tmp=poz;q=1;
		while(!(tmp&1)) q<<=1, tmp >>=1;
		poz -= q;
	}
	return s;
}

int Ppoz(int suma){
	int st=1,dr=n;
	if(suma<tree[1] || suma>Sum(n))
		return -1;
	while(st<=dr){
		int mijloc = (st+dr)>>1;
		int summ = Sum(mijloc);
		if(summ == suma)
			return mijloc;
		else
			if(summ<suma)
				st=mijloc+1;
			else
				dr=mijloc-1;
			
	}
	return -1;
}


int main(){
	
	int m,a,b,op;
	fscanf(f,"%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		fscanf(f,"%d",&a);
		Add(i,a);
	}
	for( ; m ; --m){
		fscanf(f,"%d",&op);
		if(op == 2){
			fscanf(f,"%d",&a);
			fprintf(g,"%d\n",Ppoz(a));
		}
		else{
			fscanf(f,"%d%d", &a,&b);
			if(op==0)
				Add(a,b);
			else
				fprintf(g,"%d\n",Sum(b)-Sum(a-1));
		}
	}
	return 0;
}