Cod sursa(job #1531944)

Utilizator glbglGeorgiana bgl glbgl Data 21 noiembrie 2015 14:43:51
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <iostream>

#define MAX 100100
#define in "aib.in"
#define out "aib.out"

using namespace std;

int N, tree[MAX];


void Update(int idx, int val){

	while(idx <= N){
		tree[idx] += val;
		idx += (idx & -idx);
	}
}


int Read(int idx){

	int cumFreq = 0;
	while(idx > 0){
		cumFreq += tree[idx];
		idx -= (idx & -idx);
	}

	return cumFreq;
}


int Find(int cumFreq){

	int idx = 0, bitMask = N;

	while((bitMask != 0) && (idx < N)){
		int newIdx = idx + bitMask;

		if(cumFreq >= tree[newIdx]){
			if(cumFreq == tree[newIdx])
				return newIdx;
			idx = newIdx;
			cumFreq -= tree[newIdx];
		}
		bitMask >>= 1;
	}

	if(cumFreq != 0)
		return -1;

	return idx;
}


void AIB(){

	freopen(in, "r", stdin);
	freopen(out, "w", stdout);

	int M, op, a, b;
	scanf("%d%d", &N, &M);

	for(a = 1; a <= N; ++a){
		scanf("%d", &b);
		Update(a, b);
	}

	for(int i = 0; i < M; ++i){
		scanf("%d", &op);
		if(op < 2){
			scanf("%d%d", &a, &b);
			if(op == 0) 
				Update(a, b);
			else 
				printf("%d\n", Read(b)-Read(a-1));
		}
		else{
			scanf("%d", &a);
			printf("%d\n", Find(a));
		}
	}
}

int main(){

	AIB();
	return 0;
}