Cod sursa(job #1507318)

Utilizator AndreiIstetulAndrei Andrei AndreiIstetul Data 21 octombrie 2015 16:41:13
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>
#include <stdlib.h>

#define MX 100001
#define and &&
#define not !

FILE *in, *out;
int n, m, v[MX], i, j, a, b, s;

int zeros(int x)
{
	return (-x) & x;
}

void update(int poz, int val)
{
	for (int i = poz; i <= n; i += zeros(i)) v[i] += val;
}

int sum(int poz)
{
	int s = 0;
	for (; poz; poz -= zeros(poz)) s += v[poz];
	return s;
}

int Search(int val)
{
	int i, step;

	for (step = 1; step < n; step <<= 1);

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

	return -1;
}

int main()
{
	in = fopen("aib.in", "r");
	out = fopen("aib.out", "w");

	fscanf(in, "%d %d\n", &n, &m);

	for (int i = 1; i <= n; ++i)
	{
		fscanf(in, "%d", &a);
		update(i, a);
	}

	for (i = 0; i < m; ++i)
	{
		fscanf(in, "%d", &a);

		switch (a)
		{
		case 0:
		{
			fscanf(in, "%d %d", &a, &b);
			update(a, b);
		}
		break;

		case 1:
		{
			fscanf(in, "%d %d", &a, &b);
			fprintf(out, "%d\n", sum(b) - sum(a - 1));
		}
		break;

		case 2:
		{
			fscanf(in, "%d", &a);
			fprintf(out, "%d\n", Search(a));
		}
		break;
		}
	}


	fclose(in);
	fclose(out);

	return 0;
}