Cod sursa(job #2327218)

Utilizator HumikoPostu Alexandru Humiko Data 24 ianuarie 2019 15:17:44
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
//#include "pch.h"
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m;
long long aib[100005];

void update(int position, int value)
{
	while (position <= n)
	{
		aib[position] += value;
		position += position & (-position);
	}
}

int query(int position)
{
	int ans = 0;
	while (position)
	{
		ans += aib[position];
		position -= position & (-position);
	}
	return ans;
}

void getSum(int left, int right)
{
	fout << query(right) - query(left)<<'\n';
}

void findPosition(int sum)
{
	int i = 0;
	for (int power = 20; power >= 0; --power)
	{
		if (i + (1 << power) <= n && aib[i + (1 << power)] <= sum)
		{
			i += (1 << power);
			sum -= aib[i];
		}
	}

	if (i && !sum) fout << i << '\n';
	else fout << -1 << '\n';
}

int main()
{
	ios::sync_with_stdio(false);
	fin.tie(0); fout.tie(0);

	fin >> n >> m;
	for (int i = 1; i <= n; ++i)
	{
		int x;
		fin >> x;
		update(i, x);
	}

	for (int i = 1; i <= m; ++i)
	{
		int type;
		fin >> type;

		if (type == 0)
		{
			int pos, x;
			fin >> pos >> x;
			update(pos, x);
		}

		if (type == 1)
		{
			int left, right;
			fin >> left >> right;
			getSum(left - 1, right);
		}

		if (type == 2)
		{
			int y;
			fin >> y;
			findPosition(y);
		}
	}
}