Cod sursa(job #711381)

Utilizator gener.omerGener Omer gener.omer Data 11 martie 2012 23:35:38
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <cassert>

using namespace std;

#define NMAX 100005

int C[NMAX], N, M, S[NMAX];

void add(int pos, int value){
	int nr = 0;
	C[pos] += value;
	while(pos <= N){
		while(!(pos & (1 << nr))) ++nr;
		pos += (1 << nr);
		C[pos] += value;
		++nr;
	}
}

int getSum(int lim){
	int sum = 0, nr = 0;
	while(lim > 0){
		sum += C[lim];
		while(!(lim & (1 << nr))) ++nr;
		lim -= (1 << nr);
		nr += 1;
	}
	return sum;
}

int getMinIndex(int sum){
	int start = 1, end = N, mid;
	while(start <= end){
		mid = start + (end - start) / 2;
		if(S[mid] == sum){
			while(S[mid] == sum && mid >= 1)
				--mid;
			return mid + 1;	
		}
		else if(S[mid] < sum)
			start = mid + 1;
		else
			end = mid - 1;
	}
	return -1;
}


void citire(){
	scanf("%d %d", &N, &M);
	S[0] = 0;
	for(int i = 1; i <= N; ++i){
		int el;
		scanf("%d", &el);
		add(i, el);
		S[i] = S[i-1] + el;
	}	
}


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

	for(int i = 0; i < M; ++i){
		int code, x, y;
		scanf("%d", &code);
		if(code == 0 || code == 1){
			scanf("%d %d", &x, &y);
			if(code == 0)
				add(x, y);
			else if(code == 1)
				printf("%d\n", getSum(y) - getSum(x - 1));
		}
		else{
			scanf("%d", &x);
			printf("%d\n", getMinIndex(x));
		}
	}
	return 0;
}