Cod sursa(job #2602337)

Utilizator irimia_alexIrimia Alex irimia_alex Data 16 aprilie 2020 18:21:53
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#define NMAX 100000

using namespace std;

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

int aib[NMAX], v[NMAX];

int getSum(int index) {
	int s = 0;
	while (index > 0) {
		s += aib[index];
		index -= index & (-index);
	}
	return s;
}

int getSum(int a, int b) {
	
	return getSum(b) - getSum(a - 1);
}

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

int findK(int s,int n) {
	int i = 1, j = n;
	while (i <= j) {
		int m = (i + j) / 2;
		int sum = getSum(m);
		if (sum == s && getSum(m - 1) < s)
			return m;
		if (sum >= s)
			j = m-1;
		if (sum < s)
			i = m+1;
	}
	return -1;
}

int main()
{
	int n,q;
	fin >> n >> q;
	for (int i = 1;i <= n;++i) {
		fin >> v[i];
		update(i, v[i], n);
	}

	while (q--) {
		int t;
		fin >> t;
		if (t == 1) {
			int a, b;
			fin >> a >> b;
			fout << getSum(a, b) << '\n';
		}
		else if (t == 0) {
			int index, val;
			fin >> index >> val;
			update(index, val, n);
		}
		else {
			int s;
			fin >> s;
			fout << findK(s,n) << '\n';
		}
	}

	return 0;
}