Cod sursa(job #875233)

Utilizator mads2194FMI - Andrei Stroe mads2194 Data 9 februarie 2013 20:33:02
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<cstdio>
#include<vector>
#include<queue>

#define N 100001

long long v[N];
int n,m;

#define maxp 1<<20

long long suma(int a, int b)
{
	return v[b]-v[a-1];
}


int gaseste(long val)
{
	long pas=maxp,i;
	int temp;
	for(i=n;pas>0;pas>>=1)
	{
		temp = i-pas;
		if(temp>0 && v[temp]>=val)
				i-=pas;
	}
	if(v[i]==val) return i;
	return -1;
}

void adauga(int poz,int val)
{
    while(poz<=n)
		v[poz++]+=val;
}

int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	
	short int x;
	
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%hd",&x), adauga(i,x);
	//for(int i=1;i<=n;++i) printf("%lld ",v[i]);
	
	int a,b;
	while(m--)
	{
		scanf("%d",&a);
		if(a==2)
		{
			scanf("%d",&b);
			printf("%d\n",gaseste(b));
		}
		else if(a==1)
		{
			scanf("%d %d",&a,&b);
			printf("%lld \n",suma(a,b));
		}
		else
		{
			scanf("%d %d",&a,&b);
			adauga(a,b);
		}
	}
	
	return 0;
}