Cod sursa(job #1220202)

Utilizator ptquake10ptquake10 ptquake10 Data 16 august 2014 20:26:41
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
#include <fstream>
using namespace std;
#define inf 0xfffffff

int n, m, a[100010];

void up(int p, int v) {
	while (p <= n) {
		a[p] += v;
		p += p & (-p);
	}
}

int qr(int p) {
	int s = 0;
	while (p > 0) {
		s += a[p];
		p -= p & (-p);
	}
	return s;
}

int bsc(int x) {
	int l = 1, r = n, m;
	while (r - l > 1) {
		m = (l + r) / 2;
		if (qr(m) > x) r = m; else l = m;
	}
	return qr(l) == x ? l : qr(r) == x ? r : -1;
}

int main() {
	int op, x, y;
	
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &x);
		up(i, x);
	}
	for (int i = 1; i <= m; i++) {
		scanf("%d", &op);
		switch(op) {
			case 0:
				scanf("%d %d", &x, &y);
				up(x, y); 
				break;
			case 1:
				scanf("%d %d", &x, &y);
				printf("%d\n", qr(y) - qr(x-1));
				break;
			case 2:
				scanf("%d", &x);
				printf("%d\n", bsc(x));
				break;
		}
	}
	
	return 0;
}