Cod sursa(job #514979)

Utilizator GodiesVlad Voicu Godies Data 19 decembrie 2010 23:30:26
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdlib>
#include <cstdio>
#include <iostream>

#define maxn 100001
#define maxm 150001

using namespace std;

int v[maxn];
int arb[maxn];



int sum(int value)
{
	int s = 0, x, nr;
	while (value > 0) {
		x = value;
		s += arb[value];
 		nr = 1;
		while ((x & 1) == 0) {
			nr = nr << 1;
			x = x >> 1; 
		}
		value -= nr;
	}
	return s;
}

int search(int val, int n)
{
	int i, step;
	for ( step = 1; step < n; step <<= 1 ); 
	for( i = 0; step; step >>= 1 )
	{
		if( i + step <= n)
		{
			if( val >= arb[i+step] ) 
			{
				i += step, val -= arb[i];
				if ( !val ) return i;
			}
		}
	}
	return -1;
}



void update(int poz, int val, int n)
{
	int C = 0;
	while (poz <= n)
	{
		arb[poz] += val;
		while ( !(poz & (1<<C)) ) C++;
		poz += (1<<C);
		C += 1;
	}
}


int main()
{
	int n, m, i, cod, s, value1, value2, j, x, poz, nr;
	FILE *f = fopen("aib.in", "rt");
	FILE *g = fopen("aib.out", "wt");
	fscanf(f, "%d" , &n);
	fscanf(f, "%d" , &m);
	for (i = 0; i < n; i++) {
		fscanf(f, "%d" , &v[i]);
		x = i + 1;
		nr = 1;
		while ((~x) & 1) {
			nr = nr << 1;
			x = x >> 1;
		}
		poz = i + 1;
		for (j = 0; j < nr; j++) {
			arb[i+1] += v[--poz];
		}
	}
	for (i = 0; i < m; i++) {
		fscanf (f, "%d" , &cod);
		if (cod == 0) {
			fscanf(f, "%d" , &value1);
			fscanf(f, "%d" , &value2);
			update(value1, value2, n); 
		}
		if (cod == 1) {
			fscanf(f, "%d" , &value1);
			fscanf(f, "%d" , &value2);
			s = sum(value2) - sum(value1 - 1);
			fprintf(g, "%d\n" , s);
		}
		if (cod == 2) {
			fscanf (f, "%d" , &value1);
			fprintf(g, "%d\n",  search(value1, n));
		}
	}  
	fclose(f);
	fclose(g);
	return 0;
}