Cod sursa(job #253526)

Utilizator willliIonel Bratianu willli Data 5 februarie 2009 21:44:30
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.88 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX 100001
#define in "aib.in"
#define out "aib.out"

unsigned int tree[MAX + 1], n ;

void insert(unsigned int index, unsigned int value)
{
	while (index <= n)
	{
		tree[index] += value;
		index += (index & -index);
	}
}


unsigned int sum(unsigned int index)
{
	unsigned int sum = 0;
	while (index > 0)
	{
		sum += tree[index];
		index -= (index & -index);
	}
	return sum;
}


unsigned int binary_search(unsigned int k, unsigned int total)
{
	unsigned int l = 1, r = k, m, s;
	while (l <= r) 
	{
		m = (l + r) / 2;	
		s = sum(m);
		if (total == s)
		{
			return m;
		}
		else if (total < s)
		{
			r = m - 1;
		}
		else 
		{
			l = m + 1;
		}
	}
	return 0;
}

unsigned int find_sum(unsigned int total)
{
	unsigned int l = binary_search(n, total);
	unsigned int k = 0;
	
	while (l != 0)
	{
		k = l;
		l = binary_search(l - 1, total);
	}	
	return k;
}

int main()
{
	unsigned int a[MAX], i, z, m, x, y;
	FILE *fin, *fout;
	
	if ((fin = fopen(in, "r")) == NULL)
	{
		printf("Eroare \n");
		exit(-1);
	}
	//read dimension of vectors
	fscanf(fin, "%d%d", &n, &m);

	//read the vectors
	for (i = 1; i<=n ; i++)
	{
		fscanf(fin, "%d", &a[i]);
		insert(i, a[i]);
	}
	fout = fopen(out, "w");
/*	for (i = 0; i <= n; i++)
		printf("%d ", tree[i]);		
	printf("\n");*/
	for (i = 0; i < m; i++)
	{
		fscanf(fin, "%d%d", &x, &y);
		if (x == 0)
		{
			fscanf(fin, "%d", &z);
			insert(y, z);
			//printf("Interval [%d %d] are maximul %d\n", y, z, j);
		}
		else if (x == 1)
		{
			fscanf(fin, "%d", &z);
			z = sum(z) - sum(y - 1);
			fprintf(fout, "%d\n", z);
			/*for (j = 0; j <= 2 * n + 1; j++) find(unsigned int node, unsigned int left, unsigned int right, unsigned int a, unsigned int b)
				printf("%d ", tree[j]);
			printf("\n");*/
		} else if (x == 2)
		{
			//printf("\n");
			z = find_sum(y);
			fprintf(fout, "%d\n", z == 0 ? -1 : z);
		}
	}
	fclose(fin);
	fclose(fout);
	return 0;
}