Cod sursa(job #779660)

Utilizator crushackPopescu Silviu crushack Data 18 august 2012 14:29:48
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#define zeros(x) (x&(x-1)^x)
#define NMax 100010

const char IN[]="aib.in",OUT[]="aib.out";

int N,M;
int arb[NMax];

void update(int x,int val){
	for (; x<=N ; x+=zeros(x))
		arb[x]+=val;
}

int query(int x){
	int ret=0;
	for (; x>0 ; x-=zeros(x))
		ret+=arb[x];
	return ret;
}

int search(int val){

	int step,i;
	for (step=1;step<=N;step<<=1);
	for (i=0;step;step>>=1)
		if (i+step<=N && val>=arb[i+step]){
			i+=step;val-=arb[i];
			if (!val) return i;
		}
	return -1;
}

int main()
{
	int i,c,x,a,b;
	freopen(IN,"r",stdin);
	scanf("%d%d",&N,&M);
	for (i=1;i<=N;++i)
		scanf("%d",&x),
		update(i,x);

	freopen(OUT,"w",stdout);
	while (M--)
	{
		scanf("%d",&c);
		if (c==0) scanf("%d%d",&a,&b),update(a,b);
		else if (c==1) scanf("%d%d",&a,&b),printf("%d\n",query(b)-query(a-1));
		else scanf("%d",&a),printf("%d\n",search(a));
	}
	fclose(stdout);
	fclose(stdin);
	return 0;
}