Cod sursa(job #1216230)

Utilizator ariel_roAriel Chelsau ariel_ro Data 3 august 2014 19:48:05
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define NX 100005

int N, M, A[NX], K;

int query(int poz)
{
	int sum = 0, pozZero = 0;
	while (poz > 0)
	{
		sum += A[poz];
		while (!(poz & (1 << pozZero))) 
		{
			pozZero++;
		}

		poz = poz - (1 << pozZero);
		pozZero++;
	}

	return sum;
}

int queryFinal(int st, int dr)
{
	return query(dr) - query(st - 1);
}

void update(int poz, int val)
{
	int pozZero = 0;
	while (poz <= N)
	{
		A[poz] += val;
		while (!(poz & (1 << pozZero))) 
		{
			pozZero++;
		}

		poz += (1 << pozZero);
		pozZero++;
	}
}


void determineMinK(int sum)
{
	int st = 1, dr = N, mij = 0;
	K = -1;
	while (st <= dr)
	{
		mij = (st + dr) / 2;
		int val = query(mij);
		if (sum == val)
		{
			K = mij;
			break;
		}

		if (sum > val) 
		{
			st = mij + 1;
		} 
		else if (sum < val)
		{
			dr = mij - 1;
		}
	}
}

int main()
{
   freopen("aib.in", "r", stdin);
   freopen("aib.out", "w", stdout);

   scanf("%d %d", &N, &M);

   int val = 0;
   for (int i = 1; i <= N; i++)
   {
	   scanf("%d", &val);
	   update(i, val);
   }

   int op = -1, a = 0, b = 0;
   for (int i = 1; i <= M; i++)
   {
	   scanf("%d %d", &op, &a);

	   switch (op)
	   {
	   case 0:
		   scanf("%d", &b);
		   update(a, b);
		break;
	   case 1:
		   scanf("%d", &b);
		   printf("%d\n", queryFinal(a, b));
		break;
	   case 2:
            determineMinK(a);
            printf("%d\n", K);
		break;
	   }
   }
 
}