Cod sursa(job #1213205)

Utilizator sorin2kSorin Nutu sorin2k Data 27 iulie 2014 15:53:57
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 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[100001];

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 search(){
    int left = 1, right = (int)pow(2, ceil(log((double)n)/log((double)2))), g, mid, 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() 
{
	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();
		}
	}
	return 0;
}