Cod sursa(job #2182690)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 22 martie 2018 16:21:35
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
using namespace std;
int m , n;
int v[100005];
long long sp[100005];
long long aib[100005];
void update(int poz,int val)
{
	for(;poz<=m;poz+=(poz&-poz))
		aib[poz]+=val;
}
int query(int poz)
{
	int s=0;
	for(;poz>0;poz-=(poz&-poz))s+=aib[poz];
	return s;
}
int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	int  i;
	scanf("%d%d",&m,&n);
	for(i=1;i<=m;i++)
	{
		scanf("%d",&v[i]);
		sp[i]=sp[i-1]+v[i];
	}
	for(i=1;i<=m;i++)
	{
		int cp=i;
		aib[i]=sp[i]-sp[i-(cp&-cp)];
	}
	int val1,a,b;
	for(i=1;i<=n;i++)
	{
          scanf("%d",&val1);
		  if(val1==0)
		  {
		  	scanf("%d%d",&a,&b);
		  	update(a,b);
		  	continue;
		  }
		  if(val1==1)
		  {
		  	scanf("%d%d",&a,&b);
		  	int s1=query(b),s2=query(a-1);
		  	printf("%d\n",s1-s2);
		  	continue;
		  }
		  scanf("%d",&a);
		  int st=1,dr=m,f=0;
		  while(st<=dr)
		  {
		  	int med=(st+dr)/2;
		  	int s1=query(med);
		  	if(s1==a)
			{
				printf("%d\n",med);
				f=1;
				break;
			}
		  	if(s1>a)dr=med-1;
		  	else
				st=med+1;
		  }
		  if(f==0)
		  {
		  	printf("-1\n");
		  	continue;
		  }
	}
    return 0;
}