Cod sursa(job #213979)

Utilizator vlad_popaVlad Popa vlad_popa Data 12 octombrie 2008 12:52:28
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 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 > 0; 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)
			sum -= A[i + step], i += step;

	return sum ? -1 : i;
}

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", search (a)) ;
	}

	return 0;
}