Cod sursa(job #1213221)

Utilizator sorin2kSorin Nutu sorin2k Data 27 iulie 2014 16:05:14
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <limits>
#include <vector>
#include <cstdlib>
#include <numeric>
#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;

int n, m, elem, query, a, b;
int aib[200001];

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

int get(int pos) {
	int sum = 0;
	while(pos > 0) {
		sum += aib[pos];
		pos -= (pos & (-pos));
	}
	return sum;
}

int get_sum(int a, int b){
	return get(b) - get(a-1);
}

int max_doi(int x) {
	int i = 1;
	while(i <= x) {
		i *= 2;
	}
	return i;
}

int search(){
	int left = 1, right = max_doi(n), g, mid = 0, sum = 0;
    bool found = false;
    while(left <= right && found == false){
        mid = left + (right - left) / 2;
        g = aib[mid];
        if(g + sum == a){
            found = true;
        }
        if(g + sum > a) {
            right = mid - 1;
        }else{
            sum += g;
            left = mid + 1;
        }
    }
	if(found) return mid;
	else return -1;
}


int main() 
{
//	freopen("aib.in", "r", stdin);
//	freopen("aib.out", "w", stdout);
	cin >> n >> m;
	for(int i = 0; i < n; i++){
		cin >> elem;
		update(i+1, elem);
	}
	for(int i = 0; i < m; i++){
		cin >> query;
		switch(query){
		case 0:
			cin >> a >> b;
			update(a, b);
			break;
		case 1:
			cin >> a >> b;
			cout << get_sum(a, b) <<"\n";
			break;
		case 2: 
			cin >> a;
			cout << search() << "\n";
		}
	}
	return 0;
}