Cod sursa(job #2923875)

Utilizator Andrei_EneaAndrei Enea Andrei_Enea Data 20 septembrie 2022 11:58:37
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
//#include <iostream>
#include <fstream>
#include<vector>
using namespace std;

ifstream cin("datorii.in");
ofstream cout("datorii.out");

int N;
vector<int> BIT;

void update(int i, int val) {
	while (i <= N) {
		BIT[i] += val;
		i += (i & -i);
	}
}

int prefixSum(int i) {
	int sum = 0;
	while (i > 0) {
		sum += BIT[i];
		i -= (i & -i);
	}
	return sum;
}

int rangeSum(int i, int j) {
	return prefixSum(j) - prefixSum(i - 1);
}

int main()
{
	int i, j, nr, M, type, a, b;

	cin >> N >> M;
	BIT.resize(N + 1);

	for (i = 1; i <= N; i++) {
		cin >> nr;
		update(i, nr);
	}

	for (i = 1; i <= M; i++) {
		cin >> type >> a>>b;

		if (type == 0) {
			update(a, -b);
			continue;
		}
		if (type == 1) {
			cout << rangeSum(a, b) << "\n";
			continue;
		}
		//type == 2

		bool found = false;

		for (j = 1; j <= N; j++) {
			int sum = prefixSum(j);
			if (sum == a) {
				found = true;
				break;
			}
			else if (sum > a)
				break;
		}

		if (found)
			cout << j << "\n";
		else
			cout << -1 << "\n";

	}

	return 0;

}