Cod sursa(job #756538)

Utilizator Marius96Marius Gavrilescu Marius96 Data 9 iunie 2012 20:59:07
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include<cstdio>
#define MX 100005
int t[MX];

void u (int i,int v)
{
	while(i<MX)
		t[i]+=v,i+=(i&-i);
}

int g (int i)
{
	int s=0;
	while(i)
		s+=t[i],i-=(i&-i);
	return s;
}

int main()
{
	freopen ("aib.in","r",stdin);
	freopen ("aib.out","w",stdout);
	int n,m;
	scanf ("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		int x;
		scanf ("%d",&x);
		u (i,x);
	}
	while(m--){
		int o,a,b;
		scanf ("%d%d",&o,&a);
		switch(o){
		case 0:
			scanf ("%d",&b);
			u (a,b);
			break;
		case 1:
			scanf ("%d",&b);
			printf ("%d\n",g (b)-g (a-1));
			break;
		case 2:
			int s=1,e=n;
			while(s<e){
				int m=(s+e)/2;
				if(g (m)<a)
					s=m+1;
				else
					e=m;
			}
			if(g (s)==a)
				printf ("%d\n",s);
			else
				puts ("-1");
		}
	}
	return 0;
}