Cod sursa(job #602860)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 13 iulie 2011 15:15:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<cstdio>
void read(),solve(),update(int,int);
int n,m,i,S[100010],V[100010],t,a,b,query(int),k,L,R,M,X;
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a);
		S[i]=S[i-1]+a;
		V[i]=S[i]-S[i-(i&(-i))];
	}
}
void solve()
{
	for(;m;--m)
	{
		scanf("%d",&t);
		if(!t){scanf("%d%d",&a,&b);update(a,b);continue;}
		if(t==1){scanf("%d%d",&a,&b);printf("%d\n",query(b)-query(a-1));continue;}
		scanf("%d",&k);L=0;R=n+1;
		while(R-L-1)
		{
			M=(R+L)>>1;
			X=query(M);
			if(X==k)break;
			if(X<k)L=M; else R=M;
		}
		if(X==k)printf("%d\n",M); else printf("-1\n");
	}
	
}
void update(int p,int v)
{
	for(int A=p;A<=n;A+=A&(-A))V[A]+=v;
}
int query(int p)
{
	if(p)return V[p]+query(p-(p&(-p)));
	return 0;
}