Cod sursa(job #3274232)

Utilizator Cezar2009Cezar Mihai Titihazan Cezar2009 Data 5 februarie 2025 20:22:16
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
//https://infoarena.ro/problema/aib
//#pragma GCC optimize ("Ofast")
//#pragma GCC optimize ("fast-math")
//#pragma GCC optimize ("unroll-loops")
//#define _USE_MATH_DEFINES
#include <iostream>
#include <fstream>
#include <cmath>
#include <bitset>
#include <vector>
//#include <queue>
//#include <utility>
//#include <algorithm>
//#include <string>
//#include <map>
//#include <climits>
//#include <iomanip>
using namespace std;

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

int v[100010];
void update(int p, int val, int n)
{
	int i;
	for (i = p; i <= n; i += i & (-i))
	{
		v[i] += val;
	}
}
int suma(int p)
{
	int i, rez = 0;
	for (i = p; i >= 1; i -= i & (-i))
	{
		rez += v[i];
	}
	return rez;
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, m, in, a, b;
	int i, j, rez, val, p, putd;

	fin >> n >> m;

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

	for (putd = 1; putd <= n; putd = putd << 1);
	putd = putd >> 1;

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

		if (in == 0)
		{
			fin >> a >> b;

			update(a, b, n);
		}
		else if (in == 1)
		{
			fin >> a >> b;

			fout << (suma(b) - suma(a - 1)) << "\n";
		}
		else
		{
			fin >> a;

			rez = -1;
			for (j = 0, p = putd; p != 0; p = p >> 1)
			{
				if ((j + p <= n) && (v[j + p] <= a))
				{
					j += p;
					a -= v[j];

					if (a == 0)
					{
						rez = j;
						break;
					}
				}
			}

			fout << rez << "\n";
		}
	}


	return 0;
}