Cod sursa(job #1213226)

Utilizator sorin2kSorin Nutu sorin2k Data 27 iulie 2014 16:12:12
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 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, ans = -1;
    bool found = false;
    while(left <= right && found == false){
        mid = left + (right - left) / 2;
        g = aib[mid];
        if(g + sum == a){
            ans = mid;
			right = mid - 1;
        } else {
			if(g + sum > a) {
				right = mid - 1;
			}else{
				sum += g;
				left = mid + 1;
			}
		}
    }
	return ans;
}


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;
}