Cod sursa(job #846367)

Utilizator test_13testing test_13 Data 1 ianuarie 2013 22:53:37
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <stdio.h>
#include <vector>
using namespace std;
#define Max 100001

int a[Max],n;

int suma(int idx)
{
	int s=0;
	while(idx>0)
	{
		s+=a[idx];
		idx -= idx&-idx;
	}
	return s;
}

void update(int idx,int val)
{
	while(idx<=n)
	{
		a[idx]+=val;
		idx += idx&-idx;
	}
}

int bsearch(int val)
{
	int lf=1,rt=n,md;
	while(lf<rt)
	{
		md=(lf+rt)/2;
		if(suma(md)<val)lf=md+1; else rt=md;
	}
	if(suma(lf)==val)return lf; else return -1;
}

int main()
{
	int m,op,x,y;
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
		scanf("%d %d",&n,&m);
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&x);
			update(i,x);
		}
		for(int i=1;i<=m;i++)
		{
		scanf("%d",&op);
		switch(op)
		{
		case 0: scanf("%d %d",&x,&y); 
				update(x,y);
				break;
		case 1: scanf("%d %d",&x,&y);
				printf("%d\n",suma(y)-suma(x-1));
				break;
		case 2: scanf("%d",&x);
				printf("%d\n",bsearch(x));
		}
		}
	return 0;
}