Cod sursa(job #2285982)

Utilizator marcudanfDaniel Marcu marcudanf Data 19 noiembrie 2018 17:34:56
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#define lsb(x) ((x) & (-x))

const int NMAX = 1e5 + 5;

using namespace std;

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

int n, m;
int a[NMAX];

void add(int i, int x){
	while(i <= n)
		a[i] += x, i += lsb(i);
}

int sum(int i){
	int s = 0;
	while(i)
		s += a[i], i -= lsb(i);
	return s;
}

int search(int k){
	int sol = -1;
	int left = 1;
	int right = n;
	while(left <= right){
		int mid = (left + right) / 2;
		int s = sum(mid);
		if(s == k){
			sol = mid;
			right = mid - 1;
		}else if(s > k){
			right = mid - 1;
		}else
			left = mid + 1;
	}
	return sol;
}

int main(){
	fscanf(INPUT, "%d %d", &n, &m);
	for(int i = 1; i <= n; i++){
		int x;
		fscanf(INPUT, "%d", &x);
		add(i, x);
	}
	while(m--){
		int task;
		fscanf(INPUT, "%d", &task);
		if(task == 0){
			int pos, x;
			fscanf(INPUT, "%d %d", &pos, &x);
			add(pos, x);
		}else if(task == 1){
			int x, y;
			fscanf(INPUT, "%d %d", &x, &y);
			fprintf(OUTPUT, "%d\n", sum(y) - sum(x-1));
		}else{
			int k;
			fscanf(INPUT, "%d" , &k);
			fprintf(OUTPUT, "%d\n" , search(k));
		}
	}
	return 0;
}