Cod sursa(job #1046770)

Utilizator marius135Dumitran Adrian Marius marius135 Data 3 decembrie 2013 15:08:08
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#include<iostream>

using namespace std;

#define maxn 100001

int arb[ maxn];
int N;
void add( int *arb, int index, int value) {
	
	while( index <= N) {
		arb[index] += value;
		index += (index & -index);
	}
}
int get_value( int *arb, int value) {
	int poz = 0;
	int pas = (1<<18);
	while( pas>>= 1 ) {
		if( poz + pas <= N && arb[poz + pas] <= value) {
			poz+= pas;
			value -= arb[poz];
		}
	}
	if( value == 0) {
		return poz;
	}
	return -1;
}
int sum( int *arb, int index) {
	int rez = 0;
	while( index ) {
		rez += arb[index];
		index -= ( index & -index);
	}
	return rez;
}
int main() {
	
	int  M;
	
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	scanf("%d %d", &N, &M); 
	
	for( int i = 1; i <= N; ++i) {
		int x;
		scanf("%d", &x);
		add( arb, i, x);
	}
	for( int i = 1; i <= M; ++i) {
		int a, b, c;
		scanf("%d %d", &a, &b);
		if( a == 0) {
			scanf("%d", &c);
			add( arb, b, c);
		}
		if( a == 1) {
			scanf("%d", &c);
			cout<<sum(arb, c) - sum(arb, b - 1)<<"\n";
		}
		if( a == 2) {
			cout<<get_value(arb,b)<<"\n";
		}
	}
	
		

	return 0;
}