Cod sursa(job #1536050)

Utilizator Andrei121Andrei Ghigheci Andrei121 Data 25 noiembrie 2015 16:37:24
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
int aib[100001],n;

void update(int poz,int val){
    while(poz<=n){
        aib[poz]+=val;
        poz=poz+(poz&(-poz));
    }
}

int query(int poz){
    int s=0;
    while(poz!=0){
        s+=aib[poz];
        poz=poz-(poz&(-poz));
    }
    return s;
}

int cautbin(int val){
    int poz,pas;
    poz=0;
    pas=1<<16;
    while(pas!=0){
        if(poz+pas<=n&&aib[poz+pas]<=val){
            poz+=pas;
            val-=aib[poz];
        }
        pas/=2;
    }
    if(val!=0)
        poz=-1;
    return poz;
}
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
int main()
{
    int m,i,val,poz,cer,s,l1,l2;
    in >> n >> m;
    for(i=1;i<=n;i++){
        in >> val;
        update(i,val);
    }
    for(i=1;i<=m;i++){
        in >> cer;
        if(cer==0){
            in >> poz >> val;
            update(poz,val);
        }
        if(cer==1){
            in >> l1 >> l2;
            out << query(l2)-query(l1-1) << '\n' ;
        }
        if(cer==2){
            in >> val;
            poz=cautbin(val);
            if(val==0) poz=-1;
            out << poz << '\n';
        }
    }
    return 0;
}