Cod sursa(job #1114494)

Utilizator anaid96Nasue Diana anaid96 Data 21 februarie 2014 18:13:28
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<stdio.h>

using namespace std;

FILE *in,*out;

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

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

//variabile
int elemente,intrebari;
int val,pos;
int tree[Nmax];
int tip;
int left,right;

int main(void)
{
	in=fopen("aib.in","rt");
	out=fopen("aib.out","wt");
	
	fscanf(in,"%d%d",&elemente,&intrebari);
	
	for(int i=1 ; i<=elemente ; ++i)
	{	
		fscanf(in, "%d",&val);
		update(i,val);
	}	
	
	while(intrebari--)
	{
		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);
		}	
	}
	fclose(in);
	fclose(out);
	return 0;
}	

void update(int position,int value)
{
	int power=0;
	while(position<=elemente)
	{
		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=elemente;
	while(left<=right)
	{
		int mid=(left+right)/2;
		int sum=query(mid);
		if(value==sum)
			return mid;
		else
			if(value<sum)
				right=mid;
			else
				left=mid+1;
	}		
	return -1;
}