Cod sursa(job #1471726)

Utilizator bogdanmarin69Bogdan Marin bogdanmarin69 Data 14 august 2015 23:31:12
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
using namespace std;
const int MAX = 100001;
int n, m, bit[MAX];
void update(int pos, int val){
    while(pos<=n){
        bit[pos] += val;
        pos = pos + (pos&(-pos));
    }
}
int query(int pos){
    int ans = 0;
    while(pos>0){
        ans += bit[pos];
        pos = pos - (pos&(-pos));
    }
    return ans;
}
int getpos(int val){
    int ans = 0;
    int pos = 1;
    while(pos<n) pos<<=1;
    while(pos>0){
        if(ans+pos<=n)
            if(bit[ans+pos]<=val){
                val -= bit[ans+pos];
                ans += pos;
                if(val==0) return ans;
            }
        pos>>=1;
    }
    return -1;
}
int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++){
        int x;
        scanf("%d", &x);
        update(i, x);
    }
    for(int i=1; i<=m; i++){
        int cod, a, b;
        scanf("%d%d", &cod, &a);
        if(cod!=2) scanf("%d", &b);
        if(cod==0) update(a, b);
        if(cod==1) printf("%d\n", query(b)-query(a-1));
        if(cod==2) printf("%d\n", getpos(a));
    }
    return 0;
}