Cod sursa(job #370162)

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

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

void Add(int poz, int valoare){
	q=0;
	while(poz<=n){
		tree[poz] += valoare;
		while(!(poz & (1<<q))) q++;
		poz += (1<<q);
	}
}

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

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