Cod sursa(job #1456952)

Utilizator theprdvtheprdv theprdv Data 2 iulie 2015 14:14:49
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#define zeros(x) ((x ^ (x - 1)) & x)

using namespace std;

int N, M, BIT[100001], LOG;

inline void update(int p, int x){
	for (int i = p; i <= N; i += zeros(i))
		BIT[i] += x;
}

inline int query(int p){
	int ans = 0;
	for (int i = p; i; i -= zeros(i))
		ans += BIT[i];
	return ans;
}

inline int search(int val){
	int step = LOG, k = 0;

	for (; step; step >>= 1){
		if (k + step > N) continue;
		else if (query(k + step) < val) k += step;
	}
	if (query(++k) != val) return -1;
	return k;
}

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

	scanf("%d %d", &N, &M);
	for (int i = 1, x; i <= N; ++i)
		scanf("%d", &x),
		update(i, x);

	for (LOG = 1; LOG <= N; LOG <<= 1);

	for (int type, a, b; M; --M){
		scanf("%d", &type);
		if (type < 2){
			scanf("%d %d", &a, &b);
			if (!type) update(a, b);
			else printf("%d\n", query(b) - query(a - 1));
		}
		else
			scanf("%d", &a),
			printf("%d\n", search(a));
		
	}

	return 0;
}