Cod sursa(job #2920244)

Utilizator OvidRata Ovidiu Ovid Data 23 august 2022 11:25:29
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include<bits/stdc++.h>
using namespace std;

string numeFisier="aib";
ifstream fin(numeFisier+".in"); ofstream fout(numeFisier+".out");
#define cin fin
#define cout fout

#define INIT  ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount
//#define int ll


int n, m;
int32_t a[100010];


int fw[100010];

void update(int i, int x){

for(int j=i; j<=n; j+=(j&(-j))){
    fw[j]+=x;
}

}


int query(int i){
int res=0;
for(int j=i; j>0; j-=(j&(-j))){
    res+=fw[j];
}
return res;
}




int32_t main(){
INIT
cin>>n>>m;
for(int i=1; i<=n; i++){
    cin>>a[i];
}
for(int i=1; i<=n; i++){
    update(i, a[i]);
}

while(m--){
    int tp, x, y;
    cin>>tp;
    if(tp==0){
        cin>>x>>y;
        update(x, y);
        a[x]+=y;
    }
    if(tp==1){
        cin>>x>>y;
        cout<<(query(y)-query(x-1))<<"\n";
    }
    if(tp==2){
        cin>>x;
        int l=0, r=n, mid=(l+r)>>1ll;
        while(l<r){

            if( query(mid)<x ){
                l=mid+1;
            }
            else{
                r=mid;
            }

            mid=(l+r)>>1ll;
        }
        //mid--;
        if(mid==0){
            cout<<"-1\n";
        }
        else{
        if(query(mid)==x){
            cout<<mid<<"\n";
        }
        else{
        cout<<"-1\n";
        }
        }
    }
}

return 0;
}