Cod sursa(job #1436239)

Utilizator ipus1Stefan Enescu ipus1 Data 15 mai 2015 16:01:51
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<cstdio>
int v[100001],v2[100001];
int main ()
{freopen ("aib.in","r",stdin);
freopen ("aib.out","w",stdout);
int n,m,i,j,c1,c2,x,k,q,s,c,a,b;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
	scanf("%d",&v[i]);
for(i=1;i<=n;i++)
	v[i]+=v[i-1];
for(i=1;i<=n;i++)
	{x=(i^(i&(i-1)));
	k=i-x+1;
	v2[i]=v[i]-v[k-1];
	}
for(i=1;i<=m;i++)
	{scanf("%d",&c);
	if(c==0)
		{scanf("%d%d",&a,&b);
        while(a<=n)
			{v2[a]+=b;
			x=(a^(a&(a-1)));
			a+=x;
			}
		}
	if(c==1)
		{scanf("%d%d",&a,&b);
		a--;
		s=0;
		while(a>=1)
			{s+=v2[a];
			x=(a^(a&(a-1)));
			a-=x;
			}
		q=0;
		while(b>=1)
			{q+=v2[b];
			x=(b^(b&(b-1)));
			b-=x;
			}
		printf("%d\n",q-s);
		}
	if(c==2)
		{scanf("%d",&b);
		c1=1;
		c2=n;
		while(c1<=c2)
			{a=(c1+c2)/2;
			s=0;
			while(a>=1)
				{s+=v2[a];
				x=(a^(a&(a-1)));
				a-=x;
				}
			if(s==b)
				{printf("%d\n",(c1+c2)/2);
				c1=n+1;
				}
			else
				if(s<b)
					c1=(c1+c2)/2+1;
				else
					c2=(c1+c2)/2-1;
			}
		if(c1!=n+1)
			printf("-1\n");
		}
	}
return 0;
}