Cod sursa(job #3247797)

Utilizator tudor.oancea1TOALETA SKIBIDI CEA MAI TARE tudor.oancea1 Data 9 octombrie 2024 10:11:18
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>

using namespace std;



ifstream cin("aib.in");
ofstream cout("aib.out");


const long long N = 200000;
long long bit[N+9];




void update (long long i, long long val){

while(i<=N){
    bit[i]+=val;
i+=i&-i;
}

}

long long prefix(long long i){
long long sum = 0;

while(i>0){
    sum+=bit[i];
    i-=i&-i;
}
return sum;
}



long long cb(long long x, long long n){
long long st=1, dr=n, rez = 0;

while(st<=dr){
    long long m=(st+dr)/2;

    if(prefix(m)<=x){

        rez = m;
        st=m+1;

    }
    else{
        dr=m-1;
    }
}

return rez;

}
int main()
{
    long long t,n;
    cin>>n>>t;


    for (long long i = 1; i<=n;i++){
        long long x;
        cin>>x;
        update(i,x);
    }


    for (long long i = 1; i<=t;i++){

        long long op;
        cin>>op;
        if(op==0){
                long long x,add;
            cin>>x>>add;
            update(x,add);
        }

        if(op==1){
            long long x,y;

            cin>>x>>y;

            cout<<prefix(y)-prefix(x-1)<<'\n';
        }
        if(op==2){
            long long s;
            cin>>s;

            long long poz = cb(s,n);
            if(prefix(poz)==s)
                cout<<poz<<'\n';
            else
                cout<<-1<<'\n';


        }


    }

    return 0;
}