Cod sursa(job #2040256)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 15 octombrie 2017 16:08:59
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;

int aib[N], s[N];

int n, m;

static int nextch() {
	const int BMAX = 1 << 17;

	static char buff[BMAX];
	static int bp = BMAX;

	if (bp == BMAX) {
		fread(buff, 1, BMAX, stdin);
		bp = 0; }

	return buff[bp++]; }

static void get(int &arg) {
	char ch;

	while ((ch = nextch()) < '0');
	arg = 0;
	do {
		arg = arg * 10 + ch - '0';
		ch = nextch(); }
	while (ch >= '0'); }

constexpr int lsb(int x) {
	return x & -x; }

static void update(int pos, int val) {
	for (; pos < N; pos+= lsb(pos))
		aib[pos]+= val; }

static int query(int pos) {
	int ant;
	for (ant = 0; pos > 0; pos-= lsb(pos))
		ant+= aib[pos];
	return ant; }

static int bsrch(int &val) {
	int ant = 0;

	for (int msk = 1 << 16; msk > 0; msk/= 2)
		if (ant + msk <= n && val >= aib[ant + msk]) {
			val-= aib[ant + msk];
			ant+= msk; }

	return val ? -1 : ant; }

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

	get(n), get(m);
	for (int t, i = 1; i <= n; ++i) {
		get(t);
		s[i] = s[i - 1] + t;
		aib[i] = s[i] - s[i - lsb(i)]; } // sa moara toti de ciuda!

	for (int pos, val, op, a, b, i = 1; i <= m; ++i) {
		get(op);
		switch (op) {
		case 0: {
			get(pos), get(val);
			update(pos, val);
			break; }
		case 1: {
			get(a), get(b);
			printf("%d\n", query(b) - query(a - 1));
			break; }
		case 2: {
			get(pos);
			printf("%d\n", bsrch(pos));
			break; } } }

	return 0; }