Cod sursa(job #1804911)

Utilizator AlexandruRudiAlexandru Rudi AlexandruRudi Data 13 noiembrie 2016 11:25:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

int n,q,a[100005],x,y,z;

void Upd(int pos, int val){
    int p=0;
    while(pos<=n){
        a[pos]+=val;
        while(!(pos & (1<<p))) p++;
        pos+=(1<<p);
    }
}

int Qry(int pos){
    int p=0,s=0;
    while(pos>=1){
        s+=a[pos];
        while(!(pos & (1<<p))) p++;
        pos-=(1<<p);
    }
    return s;
}

int Search(int val){
    int l=1,r=n;
    while(l!=r){
        int mid=(l+r)/2;
        if(Qry(mid)>=val) r=mid;
        else l=mid+1;
    }
    if(Qry(l)==val) return l;
    return -1;
}

int main(){
    ios_base::sync_with_stdio(0);
    ifstream in("aib.in");
    ofstream out("aib.out");
    in >> n >> q;
    for(int i=1;i<=n;i++){
        in >> x;
        Upd(i,x);
    }
    for(int i=1;i<=q;i++){
        in >> x;
        if(x==0){
            in >> y >> z;
            Upd(y,z);
        }
        if(x==1){
            in >> y >> z;
            out << Qry(z)-Qry(y-1) << '\n';
        }
        if(x==2){
            in >> y;
            out << Search(y) << '\n';
        }
    }
}