Cod sursa(job #2206031)

Utilizator whoiscrisCristian Plop whoiscris Data 20 mai 2018 21:21:54
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <vector>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

class BIT {

public:

	vector<int> arr;

	BIT(int n) {
		arr.resize(n+1, 0);	// we start at index 1 .. n
	}

	BIT (vector<int> arr_) {
		arr.resize(arr_.size()+1,0);

		for (int i=0; i<arr_.size(); i++) {
			arr[i+1] = arr_[i];
		}
	}

	void update (int i, int delta) {

		while (i < arr.size()) {
			arr[i] += delta;
			i += (i & -i);
		}
	}

	// computes prefix sum at [1 .. i]
	int prefix_sum (int i) {
		int sum = 0;

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

	// computes range sum at [i .. j]
	int range_sum (int i, int j) {
		//int pj = prefix_sum(j);
		//int pi = prefix_sum(i-1);
		return prefix_sum(j) - prefix_sum(i-1);
	}

	/*friend ostream& operator <<(ostream& out, BIT& rhs) {
		for (int i=1; i<rhs.arr.size(); ++i) {
			out << rhs.arr[i] << " ";
		return out;
	}*/

};


int op2 (BIT& bit, int a) {

	int l = 1;
	int r = bit.arr.size()-1;

	while (l <= r) {
		int m = l + ((r-l) >> 1);
		int s = bit.prefix_sum(m);
		//cout << l << ", " << m << "," << r << ": s= " << s << endl;

		if (s == a) {
			return m;
		}
		else if (s < a) {
			l = m+1;
		}
		else {
			r = m-1;
		}
	}
	return -1;
}

int main () {

	freopen ("aib.in", "r", stdin);
	freopen ("aib.out", "w", stdout);

	int n,m;
	cin >> n >> m;
	BIT bit(n);
	for (int i=0; i<n; ++i) {
		int val;
		cin >> val;
		bit.update(i+1, val);
	}

	for (int i=0; i<m; ++i) {
		int c, a, b;
		cin >> c;


		if (c == 0) {
			cin >> a >> b;
			bit.update(a,b);
			//cout << "bit: " << bit << endl;
		}
		else if (c == 1) {
			cin >> a >> b;
			int s = bit.range_sum(a,b);
			cout << s << endl;
		}
		else {
			cin >> a;
			int k = op2 (bit, a);
			cout << k << endl;
		}
	}

	return 0;
}