Cod sursa(job #3311038)

Utilizator iccjocIoan CHELARU iccjoc Data 18 septembrie 2025 20:15:51
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

int n, m;
int a[100001];

void update(int poz, int val)
{
	while(poz <= n)
	{
		a[poz] += val;
		poz += poz & (-poz);
	}
}

int query(int poz)
{
	int s = 0;
	while(poz > 0)
	{
		s += a[poz];
		poz -= poz & (-poz);
	}
	return s;
}

void operation2(int x)
{
	int s = 1;
	while(s <= n)
	{
		s <<= 1;
	}
	s >>= 1;
	int i = 0;
	for(; s > 0; s >>= 1)
	{
		if(i + s <= n && a[i + s] < x)
		{
			i += s;
			x -= a[i];
		}
	}

	if(x > 0)
	{
		cout << i + 1 << "\n";
	}
	else
	{
		cout << -1 << "\n";
	}
}

int32_t main()
{
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	cin.tie(nullptr)->sync_with_stdio(false);
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
	{
		int x;
		cin >> x;
		update(i, x);
	}
	for(int i = 1; i <= m; i++)
	{
		int c, x, y;
		cin >> c;
		if(c == 0)
		{
			cin >> x >> y;
			update(x, y);
		}
		else if(c == 1)
		{
			cin >> x >> y;
			cout << query(y) - query(x - 1) << "\n";
		}
		else
		{
			cin >> x;
			operation2(x);
		}
	}
}