Cod sursa(job #767394)

Utilizator iris88Nagy Aliz iris88 Data 13 iulie 2012 14:19:07
Problema Arbori indexati binar Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
vector<int> aib;

int get(int a,int b)
{
	int k = b;
	int sum=0;
	while (k>0)
	{
		sum+=aib[k];
		k -= k&(-k);
	}
	if (a==1) return sum;
	k = a-1;
	while (k>0)
	{
		sum -= aib[k];
		k -= k&(-k);
	}
	return sum;
}
void set(int x,int val)
{
	int k=x;
	while (k<aib.size())
	{
		aib[k]+=val;
		k+=k&(-k);
	}
}
int getpos(int sum)
{
	int ind = aib.size()/2;
	int incr = aib.size()/4;
	while (true)
	{
		if (aib[ind]<sum){
			sum -=aib[ind];
			ind +=incr;			
		}
		else
			if (aib[ind]>sum)
				ind-=incr;
			else return ind;
		if (incr==0)
			return -1;
		incr/=2;
	}
	return -1;
}
int main()
{
	FILE *f =fopen("aib.in","r");
	FILE *g =fopen("aib.out","w+");
	int n,m;
	fscanf(f,"%d %d",&n,&m);
	int dim =1;
	while (dim <= n) dim <<= 1;
	aib.resize(dim);
	int x;
	for (int i=1;i<=n;i++)
	{
		fscanf(f,"%d", &x);	
		set(i,x);
	}	
	for (int i=0;i<m;i++)
	{
		int op,a,b,res;
		fscanf(f,"%d",&op);
		switch(op){
			case 0:
				fscanf(f,"%d %d",&a,&b);
				set(a,b);
				break;
			case 1:
				fscanf(f,"%d %d",&a,&b);
				res = get(a,b);
				fprintf(g,"%d\n",res);
				break;
			case 2:
				fscanf(f,"%d",&a);
				res = getpos(a);
				fprintf(g,"%d\n",res);
				break;
			default:
				break;
		}
	}
	fclose(f);
	fclose(g);
}