Cod sursa(job #3333573)

Utilizator mariusharabariMarius Harabari mariusharabari Data 14 ianuarie 2026 11:30:46
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

const int NMAX = 1e5+1;
int n, m, aib[NMAX], x, op, a, b;

void update(int pos, int val){
    for(int i=pos; i<= n; i+=(i&(-i)))
        aib[i]+=val;
}

int query(int poz){
    int ans=0;
    for(int i=poz;i>0;i-=(i&(-i)))
        ans+=aib[i];
    //cout<<ans<<endl;
    return ans;
}

int cautare(int ans){
    int pos=0, nextp=1, sum=0;
    while(nextp*2<=n)
        nextp*=2;

    while(nextp>0){
        if(nextp+pos<=n){
            if(sum+aib[pos+nextp]<=ans){
                pos+=nextp;
                sum+=aib[pos];
                if(sum==ans)
                    return pos;
            }
        }
        nextp/=2;
    }

    return -1;
}


int main(){
    fin>>n>>m;
    for(int i=1;i<=n;i++){
        fin>>x;
        update(i, x);
    }

    while(m--){
        fin>>op;
        //cout<<op<<endl;
        if(op==0){
            fin>>a>>b;
            update(a, b);
        }
        else if(op==1){
            fin>>a>>b;
            fout<<query(b)-query(a-1)<<'\n';
        }
        else{
            fin>>a;
            fout<<cautare(a)<<'\n';
        }
    }
    return 0;
}