Cod sursa(job #565810)

Utilizator darkseekerBoaca Cosmin darkseeker Data 28 martie 2011 12:23:43
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
using namespace std;

const int NMAX = 200000;
const char Input[]="aib.in";
const char Output[]="aib.out";



int arbSum[NMAX];
int pos,val,start,final,sum=0,k,n,m;

inline void update(int node,int left,int right)
{
	int center;
	if(left==right)
	{
		arbSum[node]+=val;
		return ;
	}
	center=(left+right)/2;
	if(pos<=center)
		update(2*node,left,center);
	else
		update(2*node+1,center+1,right);
	arbSum[node]=arbSum[2*node]+arbSum[2*node+1];
}

inline void query(int node,int left,int right)
{
	int center;
	if(start<=left &&  right<=final)
	{
		sum+=arbSum[node];
		return;
	}
	center=(left+right)/2;
	if(start<=center)
		query(2*node,left,center);
	if(center<final)
		query(2*node+1,center+1,right);
}

inline int cauta(int k)
{
	sum=0;
	start=1,final=n;
	int li=1,ls=n,center;
	while(li<=ls)
	{
		center=(li+ls)/2;
		sum=0;
		final=center;
		query(1,1,n);
		if(sum>k)
			ls=center-1;
		if(sum<k)
			li=center+1;
		if(sum==k)
			return center;
	}
	return -1;
}

int main()
{
	freopen (Input,"r",stdin);
	freopen (Output,"w",stdout);
	scanf("%d %d",&n,&m);
	int i,tip,a,b;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&val);
		pos=i;
		update(1,1,n);
	}
	
	for(i=1;i<=m;i++)
	{
		scanf("%d",&tip);
		switch(tip)
		{
			case 0:scanf("%d %d",&pos,&val);update(1,1,n);break;
			case 1:scanf("%d %d",&start,&final);sum=0;query(1,1,n);printf("%d\n",sum);break;
			case 2:scanf("%d",&k);printf("%d\n",cauta(k));break;
		}
	}
	return 0;
}