Cod sursa(job #1094349)

Utilizator anaid96Nasue Diana anaid96 Data 29 ianuarie 2014 12:18:51
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<stdio.h>
using namespace std;

FILE *in,*out;

//functii
void update(int position,int value);
int query(int position);
int search(int value);

//constante
const int Nmax=(int) 1e5+1;

//variabile
int n,m;
int val,pos,tip,left,right;
int tree[Nmax];

int main(void)
{
	in=fopen("aib.in","rt");
	out=fopen("aib.out","wt");
	fscanf(in,"%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	{	
		fscanf(in,"%d",&val);
		update(i,val);
	}
	while(m--)
	{
		fscanf(in,"%d",&tip);
		if(tip)
		{
			if(tip==1)
			{
				fscanf(in,"%d%d",&left,&right);
				fprintf(out,"%d\n",query(right)-query(left-1));	
			}	
			else
			{
				fscanf(in,"%d",&val);
				fprintf(out,"%d\n",search(val));
				
			}	
		}	
		else
		{	
			fscanf(in,"%d%d",&pos,&val);
			update(pos,val);
		}	
		
	}	
	//for(int i=1;i<=n;++i)
		//fprintf(out,"%d ",tree[i]);
	fclose(in);
	fclose(out);
	return 0;
}

void update(int position,int value)
{
	int power=0;
	while(position<=n)
	{
		tree[position]+=value;
		while(!(1<<power & position))
			++power;
		position+=(1<<power);
	}	
}

int query(int position)
{
	int sum=0;
	int power=0;
	while(position)
	{
		sum+=tree[position];
		while(!(1<<power & position))
			power++;
		position-=(1<<power);
	}	
	return sum;
}	

int search(int value)
{
	int left=1;
	int right=n;
	while(left<=right)
	{
		int mid=(left+right)/2;
		int sum=query(mid);
		if(value==sum)
			return mid;
		if(value<sum)
			right=mid-1;
		else
			left=mid+1;
	}	
	return -1;
}