Cod sursa(job #1553041)

Utilizator howsiweiHow Si Wei howsiwei Data 19 decembrie 2015 04:31:05
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

class Fenwick {
	vector<int> a;
	int n;
	int msb;
public:
	Fenwick(int n) : n(n) {
		a.resize(n+1);
		for (int i = 1; i <= n; ++i) {
			cin >> a[i];
		}
		for (msb = 1; msb*2 <= n; msb *= 2);
		for (int stp = 2; stp <= n; stp *= 2)
			for (int i = stp; i <= n; i += stp)
				a[i] += a[i-stp/2];
	}
	void update(int idx, int val) {
		idx++;
		while (idx <= n) {
			a[idx] += val;
			idx += idx & -idx;
		}
	}
	int getsum(int lo, int hi) {
		int sum = 0;
		while (hi > lo) {
			sum += a[hi];
			hi &= hi-1;
		}
		while (lo > hi) {
			sum -= a[lo];
			lo &= lo-1;
		}
		return sum;
	}
	int idx_of_sum(int sum) {
		int idx = 0;
		for (int stp = msb; stp > 0; stp /= 2) {
			idx += stp;
			if (idx <= n && sum >= a[idx]) {
				sum -= a[idx];
				if (sum == 0) return idx;
			}
			else idx -= stp;
		}
		return -1;
	}
};

int main() {
	ios::sync_with_stdio(false);
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	int n, m;
	cin >> n >> m;
	Fenwick bit(n);
	int op, idx, lo, hi, val;
	for (int i = 0; i < m; ++i) {
		cin >> op;
		if (op == 0) {
			cin >> idx >> val;
			idx--;
			bit.update(idx, val);
		}
		else if (op == 1) {
			cin >> lo >> hi;
			lo--;
			printf("%d\n", bit.getsum(lo, hi));
		}
		else if (op == 2) {
			cin >> val;
			printf("%d\n", bit.idx_of_sum(val));
		}
	}

}