Cod sursa(job #1364471)

Utilizator MaarcellKurt Godel Maarcell Data 27 februarie 2015 18:06:35
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
using namespace std;

int N,M,tree[100010];

int sum(int r){
    int res=0;
    while (r){
        res+=tree[r];
        r-=(r&-r);
    }
    return res;
}

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

void update(int ind, int val){
    while (ind<=N){
        tree[ind]+=val;
        ind+=(ind&-ind);
    }
}

int find_min(int sum){
    int lg=0,p=0;
    for (lg=0; (1<<(lg+1))<=N; lg++) ;

    for (; lg>=0; lg--){
        if (p+(1<<lg)<=N)
            if (sum>=tree[p+(1<<lg)]){
                p+=(1<<lg), sum-=tree[p];
                if (!sum) return p;
            }
    }
    return -1;
}

int main(){
    ifstream fin("aib.in");
    ofstream fout("aib.out");
    fin >> N >> M;

    int i,x,o,val;
    for (i=1; i<=N; i++){
        fin >> x; update(i,x);
    }

    for (i=1; i<=M; i++){
        fin >> o >> x;
        if (o==0){
            fin >> val;
            update(x,val);
        }
        else if (o==1){
            fin >> val;
            fout << get_sum(x,val) << "\n";
        }
        else fout << find_min(x) << "\n";

    }

    return 0;
}