Cod sursa(job #2649489)

Utilizator mihhTURCU MIHNEA ALEXANDRU mihh Data 14 septembrie 2020 22:07:04
Problema Arbori indexati binar Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
using namespace std;

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

int n;
vector<int> ai;

void update(int ind, int val, int le=1, int ri=n, int pos=1){
    int mid=(le+ri)/2;
    ai[pos]+=val;
    if(le!=ri)
        if(ind<=mid) update(ind,val, le,mid, 2*pos);
        else update(ind,val, mid+1,ri, 2*pos+1);
}

int sum(int a, int b, int le=1, int ri=n, int pos=1){
    // cout<<le<<" "<<ri<<"\n";
    // cout<<a<<" "<<b<<"\n";
    // cout<<pos<<"\n\n";
    if(a==le and b==ri)
        return ai[pos];

    int mid=(le+ri)/2, ans=0;
    if(a<=mid)
        ans+=sum(a,min(mid,b), le,mid, pos*2);
    if(b>mid)
        ans+=sum(max(mid+1,a),b, mid+1,ri, 2*pos+1);
    return ans;
}

int main() {
    int m; fin>>n>>m;
    ai.resize(4*n+1,0);
    for(int i=1;i<=n;++i){
        int x;
        fin>>x;
        update(i,x);
    }
    // for(auto x:ai)
    //     cout<<x<<" ";
    for(int i=1;i<=m;++i){
        int x,y,z;
        fin>>x>>y;
        if(x<=1){
            fin>>z;
            if(x==0)
                update(y,z);
            else
                fout<<sum(y,z)<<"\n";
        }
        else{
            //vedewm
            int ans=-1;
            int le=1, ri=n;
            while(le<=ri){
                int mid=(le+ri)/2;
                int val=sum(1,mid);
                // cout<<mid<<" "<<val<<"\n";
                if(val==y){
                    ans=mid;
                    goto ff;
                }
                if(val>y) ri=mid-1;
                else le=mid+1;
            }
            ff:fout<<ans<<"\n";
        }
    }
}