Cod sursa(job #3334282)

Utilizator IleaIlea Bogdan Ilea Data 17 ianuarie 2026 10:09:13
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include<iostream>
using namespace std;

#define NMAX 100001

int n,aib[NMAX];
void update(int ind,int val){
    for(;ind<=n;ind+=(ind&-ind)){
        aib[ind]+=val;
    }
}
int query(int ind){
    int sum=0;
    for(;ind>0;ind-=(ind&-ind)){
        sum+=aib[ind];
    }
    return sum;
}
int lastk(int k){
    int st=1,dr=n,ans=-1;
    while(st<=dr){
        int mij=(st+dr)/2;
        int q=query(mij);
        if(k<=q){
            if(q==k){
                ans=mij;
            }
            dr=mij-1;
        }else{
            st=mij+1;
        }
    }
    return ans;
}
int main(void){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int q;
    cin>>n>>q;
    for(int i=1;i<=n;++i){
        int x;
        cin>>x;
        update(i,x);
    }
    for(;q;--q){
        int op;
        cin>>op;
        if(op==0){
            int x,y;
            cin>>x>>y;
            update(x,y);
        }else if(op==1){
            int x,y;
            cin>>x>>y;
            if(x>y)swap(x,y);
            cout<<query(y)-query(x-1)<<"\n";
        }else{
            int x;
            cin>>x;
            cout<<lastk(x)<<"\n";
        }
    }
    return 0;
}