Cod sursa(job #1606101)

Utilizator bence21Bako Bence bence21 Data 19 februarie 2016 20:51:06
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#include <fstream>
using namespace std;
#define in "aib.in"
#define out "aib.out"
#define dim 100001
int N,M,T;
int Arb[dim];
int C,S;
int gstep;
int Search(int val)
{
	int i,step=gstep;
	for(i = 0; step; step >>= 1)
		if(i+step<=N&&
		   val>=Arb[i+step])
		{
			i += step,val -= Arb[i];
			if(!val) return i;
		}
	return -1;
}
void Update(int poz,int val)
{
	C = 0;
	while(poz<=N)
	{
		Arb[poz] += val;
		poz+=(((poz^(poz-1))+1)>>1);
	}
}
int Query(int poz)
{
	S = 0;
	while(poz > 0)
	{
		S += Arb[poz];
		poz=poz&(poz-1);
	}
	return S;
}
int main()
{
	memset(Arb,0,sizeof(Arb));
	int K,X,Y;
	freopen(in,"r",stdin);
	freopen(out,"w",stdout);
	scanf("%d%d",&N,&M);
	for(gstep = 1; gstep < N; gstep <<= 1);
	for(int i = 1; i<=N; i++)
	{
		scanf("%d",&T);
		Update(i,T);
	}
	for(; M; M--)
	{
		scanf("%d",&K);
		if(K < 2)
		{
			scanf("%d%d",&X,&Y);
			if(!K) Update(X,Y);
			else      printf("%d\n",Query(Y)-Query(X-1));
		}
		else
		{
			scanf("%d",&X);
			printf("%d\n",Search(X));
		}
	}
}