Cod sursa(job #822792)

Utilizator florin_marius90Florin Marius Popescu florin_marius90 Data 24 noiembrie 2012 01:06:51
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.64 kb
#include <stdio.h>
#include <stdlib.h>


void update(int *v, int size, int index, int value);
int query(int *v, int size, int index);
int find(int *v, int size, int value);

int main()
{
	int n = 0;
	int m = 0;

	FILE *f = fopen("aib.in", "rt");
	FILE *g = fopen("aib.out", "wt");
	fscanf(f, "%i%i", &n, &m);
	int i;
	int *v = (int *)malloc(n * sizeof(int) + 1);
	int nr;
	for (i = 1; i <= n; i++)
	{
		fscanf(f, "%i", &nr);
		update(v, n, i, nr);
	}
	int op = 0, a = 0, b = 0, result = -1;
	for (; m; --m)
	{
		fscanf(f, "%i", &op);
		if (!op)
		{
			fscanf(f, "%i%i", &a, &b);
			update(v, n, a, b);
		}
		else
		{
			if (1 == op)
			{	
				fscanf(f, "%i%i", &a, &b);
				result = query(v, n, b) - query(v, n, a - 1);
				fprintf(g, "%i\n", result);
			}
			else
			{
				fscanf(f, "%i", &a);
				result = find(v, n, a);
				fprintf(g, "%i\n", result);
			}		
		}
	}
	fclose(f);
	fclose(g);

	return 0;
}

void update(int *v, int size, int index, int value)
{
	int zeros = 0;
	while (index <= size)
	{
		zeros = 0;
		v[index] += value;
		while (! (index & (1 << zeros)))
		{
			zeros++;
		}
	
		index += (1 << zeros);
	}

}

int query(int *v, int size, int index)
{
	int sum = 0;
	int zeros = 0;
	
	while (index > 0)
	{
		sum += v[index];
		zeros = 0;
		while (! (index & (1 << zeros)))
		{
			zeros++;
		}
		index -= (1 << zeros);

	}

	return sum;
	
}

int find(int *v, int size, int value)
{

	int pow = 1;
	for (; pow <= size; pow <<= 1);
	pow >>= 1;
	int index = 0;
	while (pow)
	{
		if (index + pow <= size && value >= v[index + pow])
		{
			value -= v[index + pow];
			if (!value)
			{
				return index + pow;
			}

			index += pow;
		}
		pow >>= 1;
	}
	return -1;
}