Cod sursa(job #2335563)

Utilizator Alex03Runcan Alexandru Alex03 Data 4 februarie 2019 11:56:57
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;
#define dim 100001
ifstream fin ("aib.in"); ofstream fout ("aib.out");

inline int Minim (int a, int b)
{
	if (a < b) return a; return b;
}

int N, M, T;
int Arb[dim];
int C, S;

void Update (int, int);
int Query (int);
int Search (int);

int main ()
{
	memset (Arb, 0, sizeof(Arb));
	int K, X, Y;
	fin >> N >> M;
	for (int i = 1; i <= N; i++)
	{
		fin >> T;
		Update(i,T);
	}

	for ( ; M; M--)
	{
		fin >> K;
		if (K < 2)
		{
			fin >> X >> Y;
			if (!K) Update (X, Y);
			else fout << Query(Y) - Query (X - 1) << '\n';
		}
		else
		{
			fin >> X;
			fout << Search(X) << '\n';
		}
	}
}

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 >= 	Arb [i + step])
			{
				i += step,  val -= Arb[i];
				if (!val) return i;
			}
		}
	}
	return -1;
}

void Update(int poz, int val)
{
	C = 0;
	while (poz <= N)
	{
		Arb[poz] += val;
		while (!(poz & (1 << C))) C++;
		poz +=	(1 << C);
		C +=1 ;
	}
}

int Query(int poz)
{
	C = 0; S = 0;
	while (poz > 0)
	{
		S += Arb[poz];
		while (!(poz & (1 << C))) C++;
		poz -= 	(1 << C);
		C += 1;
	}
	return S;
}