Cod sursa(job #1640384)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 8 martie 2016 17:18:16
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <functional>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <bitset>
#include <stack>
#include <iomanip>
#include <fstream>
#define MOD 105011
#define NMAX 10005
#define INF 0x3f3f3f3f
#define pb push_back

using namespace std;

FILE *fin = freopen("aib.in", "r", stdin);
FILE *fout = freopen("aib.out", "w", stdout);

typedef pair<int, int> pii;

int v[NMAX], n;

inline int lsb(int x) { return ((x&(x - 1)) ^ x); }

void update_aib(int poz, int val) {
	while (poz <= n) {
		v[poz] += val;
		poz += lsb(poz);
	}
}

int sum_aib(int poz) {
	int s = 0;

	while (poz > 0) {
		s += v[poz];
		poz -= lsb(poz);
	}

	return s;
}

int cauta(int sum) {
	int i, p2 = 1;

	while (p2 < n)
		p2 <<= 1;

	for (i = 0; p2 > 0; p2 >>= 1) {
		if (i + p2 <= n && sum >= v[i + p2]) {
			sum -= v[i + p2];
			i += p2;
			if (sum == 0)
				return i;
		}
	}

	return -1;
}

int main() {
	int i, q, nr, t, a, b;

	scanf("%d%d", &n, &q);

	for (i = 1; i <= n; ++i) {
		scanf("%d", &nr);
		update_aib(i, nr);
	}

	for (i = 0; i < q; ++i) {
		cin >> t;

		if (t == 0) {
			cin >> a >> b;
			update_aib(a, b);
		}
		else if (t == 1) {
			cin >> a >> b;
			printf("%d\n", sum_aib(b) - sum_aib(a - 1));
		}
		else {
			cin >> a;
			printf("%d\n", cauta(a));
		}
	}

	return 0;
}