Cod sursa(job #3313229)

Utilizator DobraVictorDobra Victor Ioan DobraVictor Data 2 octombrie 2025 21:52:25
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <stdint.h>

const int32_t MAX_N = 100000;
const int32_t MAX_N_POW_2 = 1 << 16;

int32_t n, m;
int32_t sum[MAX_N + 1];

void AddVal(int32_t ind, int32_t val) {
	for(int32_t i = ind; i <= n; i += i & ~(i - 1))
		sum[i] += val;
}
int32_t GetSum(int32_t ind) {
	int32_t res = 0;
	for(int32_t i = ind; i; i -= i & ~(i - 1))
		res += sum[i];
	return res;
}
int32_t SearchSum(int32_t val) {
	int32_t pos = 0, total = 0;
	for(int32_t step = MAX_N_POW_2; step; step >>= 1) {
		if(pos + step <= n && total + sum[pos + step] <= val) {
			pos += step;
			total += sum[pos];
		}
	}
	if(total == val) {
		return pos;
	} else {
		return -1;
	}
}

int main() {
	std::ifstream fin("aib.in");
	std::ofstream fout("aib.out");

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

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

		if(c == 0) {
			int32_t a, b;
			fin >> a >> b;
			AddVal(a, b);
		} else if(c == 1) {
			int32_t a, b;
			fin >> a >> b;
			fout << (GetSum(b) - GetSum(a - 1)) << '\n';
		} else {
			int32_t a;
			fin >> a;
			fout << SearchSum(a) << '\n';
		}
	}

	fin.close();
	fout.close();

	return 0;
}