Cod sursa(job #1694497)

Utilizator GeorginskyGeorge Georginsky Data 25 aprilie 2016 15:31:19
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#define NMAX 100001
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
long long n, m, a[NMAX], BIT[NMAX];
void update(int x, int val){
    for(;x<=n; x+=x&(-x))BIT[x]+=val;
}

int query(int x){
    int s=0;
    for(; x>0; x-=x&(-x))s+=BIT[x];
    return s;
}

int searchForValue(int sum){
    int pos=n+1, B;
    int limst=0, limdr=n+1;
    int S=0;
    B=n;
    S=query(B);
    if(S==sum)pos=n;

    while(B){
        B=(limst+limdr)>>1;
        S=query(B);
        if(S>sum){
            if(limdr>B)limdr=B;
            B-=1;
        }else if(S==sum){
            pos=min(pos,B);
            limdr=B;
            B-=1;
        }else{
            if(limst<B)limst=B;
            B+=1;
        }
        if(B<=limst)break;
        if(B>=limdr)break;
    }
    if(pos==n+1)return -1;
    return pos;
}

void init(){
    for(int i=1; i<=n; i++)update(i, a[i]);
}

void read(){
    in>>n>>m;
    int op, X, B;
    long A;
    for(int i=1; i<=n; i++)in>>a[i];
    init();
    a[0]=0;
    for(int i=1; i<=m; i++){
        in>>op;
        if(op==0){
            in>>X>>B;
            a[X]+=B;
            update(X, B);
        }else if(op==1){
            in>>X>>B;
            out<<query(B)-query(X-1)<<"\n";
        }else{
            in>>A;
            out<<searchForValue(A)<<"\n";
        }
    }
}

int main(){
    read();
    return 0;
}