Cod sursa(job #3197744)

Utilizator amavutsiviataAndrei Preda amavutsiviata Data 27 ianuarie 2024 13:18:46
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>

using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");

const int MAX_N = 1e5 + 1;
int n, aib[MAX_N], a[MAX_N], s[MAX_N], m;

void update(int indice, int val)
{
	int lsb = 0;
	while (indice <= n)
	{
		aib[indice] += val;
		indice += (indice & -indice);
	}
}

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

int main()
{
	int i, c, ind, val, x, y;
	cin >> n >> m;
	for (i = 1; i <= n; i++)
	{
		cin >> a[i];
		s[i] = s[i - 1] + a[i];
		int lsb = (i & -i);
		aib[i] = s[i] - s[i - lsb];
	}
	for (i = 0; i < m; i++)
	{
		cin >> c;
		if (c == 0)
		{
			cin >> ind >> val;
			update(ind, val);
			a[ind] += val;
		}
		if (c == 1)
		{
			cin >> x >> y;
			cout << query(y) - query(x - 1) << '\n';
		}
		if (c == 2)
		{
			cin >> val;
			int st = 1, dr = n, poz = -1;
			while (st <= dr)
			{
				int mij = (st + dr) / 2;
				if (query(mij) < val)
				{
					st = mij + 1;

				}
				else { dr = mij - 1;if (query(mij) == val) poz = mij; }
			}
			cout << poz << '\n';
		}
	}
}