Cod sursa(job #213983)

Utilizator vlad_popaVlad Popa vlad_popa Data 12 octombrie 2008 13:08:54
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>

int N, M;
int A[100005];

void update (int i, int val){
	for (; i <= N; i += i ^ (i - 1) & i)
		A[i] += val;
}

int query (int i){
	int sum = 0;

	for (; i; i -= i ^ (i - 1) & i)
		sum += A[i];
	return sum;
}

int search (int sum){
	int step, i;

	for (step = 1; step < N; step <<= 1);
	for (i = 0; step; step >>= 1)
		if (i + step <= N && A[i + step] <= sum){
			i += step;
			sum -= A[i];
		}

	return (!sum ? i : -1);
}

int main (){
	freopen ("aib.in", "rt", stdin);
	freopen ("aib.out", "wt", stdout);

	int val;
    scanf ("%d %d\n", &N, &M);
	for (int i = 1; i <= N; ++ i)
		scanf ("%d ", &val), update (i, val);

	int a, b, c;
    for (int i = 1; i <= M; ++ i){
		scanf ("%d ", &c);
		if (!c) scanf ("%d %d\n", &a, &b), update (a, b);
		else if (c == 1) scanf ("%d %d\n", &a, &b), printf ("%d\n", query (b) - query (a-1));
		else scanf ("%d\n", &a), printf ("%d\n", !a ? -1 : search (a)) ;
	}

	return 0;
}