Cod sursa(job #240405)

Utilizator swift90Ionut Bogdanescu swift90 Data 7 ianuarie 2009 16:44:45
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<stdio.h>
int n,m;
unsigned int nr[100010];
int bit(int x){
	return (x&(x-1))^x;
}
void add(int poz,int val){
	nr[poz]+=val;
	while((poz+=bit(poz))<=n)
		nr[poz]+=val;
}
unsigned int sum(int poz){
	unsigned int s=0;
	while(poz){
		s+=nr[poz];
		poz-=bit(poz);
	}
	return s;
}
int caut(unsigned int x){
	int i,p=0;
	unsigned int s;
	for(i=1<<20;i;i>>=1){
		if(i+p>n)
			continue;
		p+=i;
		s=sum(p);
		if(s==x)
			return p;
		if(s<x)
			continue;
		p-=i;
	}
	return -1;
}
int main(){
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	int i,x;
	unsigned int a,b;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i){
		scanf("%d",&x);
		add(i,x);
	}
	for(i=0;i<m;++i){
		scanf("%d",&x);
		if(x==0){
			scanf("%d%d",&a,&b);
			add(a,b);
		}
		if(x==1){
			scanf("%d%d",&a,&b);
			printf("%d\n",(unsigned int)sum(b)-(unsigned int)sum(a-1));
		}
		if(x==2){
			scanf("%d",&a);
			printf("%d\n",caut(a));
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}