Cod sursa(job #1342379)

Utilizator anaid96Nasue Diana anaid96 Data 13 februarie 2015 22:02:34
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

FILE *in, *out;

//definitions

//constants
const int sz = (int) 1e5+1;

//variables
int n, quest;
int val, pos;

int tree[sz];

int type;
int left, right;


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

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

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

int query(int position)
{
	int power = 0;
	int sum = 0;
	
	while( position )
	{
		while( !((1<<power) & position))
			power ++;
		
		sum += tree[position];
		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(sum == value)
			return mid;
		else
			if(value < sum)
				right = mid-1;
			else
				left = mid+1;
	}
	return -1;
}