Cod sursa(job #3120563)

Utilizator stefanbejan07Bejan Stefan stefanbejan07 Data 7 aprilie 2023 15:39:53
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int AIB[400005], N, M;

void Update(int P, int quantity)
{
	for (int i = P; i <= N; i += (i & -i))
		AIB[i] += quantity;
}
long long Query(int P)
{
	long long SUM = false;
	for (int i = P; i > 0; i -= (i & -i))
		SUM += AIB[i];
	return SUM;
}
void Task()
{
	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 C;
		fin >> C;
		int A, B;
		if (C == 0)
		{
			fin >> A >> B;
			Update(A, B);
		}
		else if (C == 1)
		{
			fin >> A >> B;
			fout << Query(B) - Query(A - 1) << '\n';
		}
		else
		{
			fin >> A;
			int left = 1, right = N;
			int ans = false;
			while (left <= right)
			{
				int mid = (left + right) / 2;
				long long S = Query(mid);
				if (S == A)
				{
					ans = mid;
					right = mid - 1;
				}
				else if (S > A)
					right = mid - 1;
				else
					left = mid + 1;
			}
			fout << ans << '\n';
		}
	}
	fin.close();
	fout.close();
}
int main()
{
	ios_base::sync_with_stdio(false);
	Task();
	return 0;
}