Cod sursa(job #2450193)

Utilizator r00t_Roman Remus r00t_ Data 22 august 2019 12:10:50
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
#include <cmath>
#include <iomanip>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int aib[100100];

void add(int k, int n, int x)
{
	while (k <= n)
	{
		aib[k] += x;
		k += k & -k;		
	}
}

int sum(int k)
{
	int total = 0;
	while (k > 0)
	{
		total += aib[k];
		k -= k & -k;
	}
	return total;
}

int Find(int val, int n)
{
	int bit, poz = 0, i;
	for (bit = 0; bit < n; bit <<= 1);
	for (i = 0; bit; bit >>= 1)
	{
		if (i + bit <= n && aib[i + bit] <= val)
		{
			val -= aib[i + bit];
			i += bit;
		}
	}
	if (val)
		return -1;
	return i;
}

int main()
{
	ios_base::sync_with_stdio(false);
	int n, m, Max = 0;
	fin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		int x;
		fin >> x;
		Max = max(Max, x);
		add(i, n, x);
	}


	for (int i = 1; i <= m; i++)
	{
		int t, x, y;
		fin >> t;
		if (t == 0)
		{
			fin >> x >> y;
			add(x, n, y);
		}
		if (t == 1)
		{
			fin >> x >> y;
			cout << sum(y) - sum(x-1) << '\n';
		}
		if (t == 2)
		{
			fin >> x;
			if (!x) {

				fout << -1 << '\n';

				continue;

			}

			fout << Find(x, n) << '\n';
		}
	}


}