Cod sursa(job #2282636)

Utilizator marcudanfDaniel Marcu marcudanf Data 14 noiembrie 2018 10:51:17
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>

const int NMAX = 1e5 + 5;

using namespace std;

FILE *INPUT = fopen("aib.in", "r");
FILE *OUTPUT = fopen("aib.out", "w");

int a[NMAX];
int n, m;

void update(int pos, int val){
	while(pos <= n){
		a[pos] += val;
		pos += pos & (-pos);
	}
}

int prefix(int pos){
	int res = 0;
	while(pos){
		res += a[pos];
		pos -= pos & (-pos);
	}
	return res;
}

int range(int ix1, int ix2){
	return prefix(ix2) - prefix(ix1 - 1);
}

int search(int val){
	int logn;
	for(logn = 1; logn < n; logn <<= 1);
	for(int i = 0; logn; logn >>= 1){
		if(i + logn <= n and val >= a[i+logn]){
			i += logn;
			val -= a[i];
			if(!val)
				return i;
		}
	}
	return -1;
}

int main(){
	fscanf(INPUT, "%d %d", &n, &m);
	for(int i = 1; i <= n; i++){
		int val;
		fscanf(INPUT, "%d", &val);
		update(i, val);
	}
	while(m--){
		int task;
		fscanf(INPUT, "%d", &task);
		if(task == 0){
			int pos, val;
			fscanf(INPUT, "%d %d", &pos, &val);
			update(pos, val);
		}else if(task == 1){
			int pos1, pos2;
			fscanf(INPUT, "%d %d", &pos1, &pos2);
			fprintf(OUTPUT, "%d\n", range(pos1, pos2));
		}else{
			int val;
			fscanf(INPUT, "%d", &val);
			fprintf(OUTPUT, "%d\n", search(val));
		}
	}
	return 0;
}