Cod sursa(job #2727387)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 21 martie 2021 20:00:15
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

#define scanf (void)!scanf

using namespace std;

void Files(){
    (void)!freopen("aib.in", "r", stdin);
    (void)!freopen("aib.out", "w", stdout);
}

int bit[100002];
int N, M, val;

int sum(int idx){
	int ret = 0;
	for(;idx > 0;idx -= idx & -idx)
		ret += bit[idx];
	return ret;
}

int Query(int l, int r){
	return sum(r) - sum(l - 1);
}

void add(int idx, int delta){
	for(;idx <= N;idx += idx & -idx)
		bit[idx] += delta;
}

int SearchIdx(int target){
	int l = 1, r = N, ans = -1;
	while(l <= r){
		int m = (l + r) >> 1;
		int val = sum(m);
		if(val == target)
			ans = m;
		if(val < target) l = m +  1;
		else r = m - 1;
	}

	return ans;
}

int main(){
	Files();

	scanf("%d%d", &N, &M);

	for(int i = 1;i <= N;i++){
		scanf("%d", &val);
		add(i, val);
	}

	while(M--){
		int t, x, y;
		scanf("%d", &t);
		if(t == 0)
			scanf("%d%d", &x, &y), add(x, y);
		if(t == 1)
			scanf("%d%d", &x, &y), printf("%d\n", Query(x, y));
		if(t == 2)
			scanf("%d", &x), printf("%d\n", SearchIdx(x));
	}

}