Cod sursa(job #175751)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 10 aprilie 2008 13:03:12
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
using namespace std;
#define last(x) (x&(-x))
#define MAX_N 100100

int A[MAX_N];
int a, b, n, i, t, c;

void update(int p, int x) {
	for ( int i=p; i<=n; i += last(i) )
		A[i] += x;
}

int sum(int p) {
	int s = 0;
	for ( int i=p; i; i -= last(i) ) 
		s += A[i];
	return s;
}

int strange(int x) {
	int s = sum(n);
	if ( s == x ) return n;
	int p, tot, target=0;
	for ( p=1; p<n; p<<=1 );
	for ( tot=0; p; p>>=1 )
		if ( tot+p<=n && target+A[tot+p] <= x ) 
			tot += p, target += A[tot];
	if ( target==x ) return tot;
	return -1;
}

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

	scanf("%d %d", &n, &t);
	for ( i=1; i<=n; ++i ) {
		scanf("%d", &a);
		update(i, a);
	}

	while ( t-- ) {
		scanf("%d", &c);
		switch ( c ) {
			case 0:
				scanf("%d %d", &a, &b);
				update(a,b);
				break;
			case 1:
				scanf("%d %d", &a, &b);
//				fprintf(stderr, "%d %d\n", sum(b), sum(a-1));
				printf("%d\n", sum(b)-sum(a-1));
				break;
			case 2:
				scanf("%d", &a);
				printf("%d\n", strange(a));
				break;
		}
	}
	return 0;
}