Cod sursa(job #3311083)

Utilizator OrhanZLTOrhan Zlatkov OrhanZLT Data 19 septembrie 2025 11:41:53
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <cmath>
#define ll long long

using namespace std;

const ll MOD=1000000007;
const string filename="aib";
ifstream fin(filename+".in");
ofstream fout(filename+".out");
void update(vector<ll> &aib,ll val,ll pos){
    ll x=aib.size();
    while(pos<x){
        aib[pos]+=val;
        pos+=(pos&(-pos));
    }
}
ll prefsum(vector<ll> &aib,ll pos){
    ll sum=0;
    while(0<pos){
        sum+=aib[pos];
        pos-=(pos&(-pos));
    }
    return sum;
}
ll srq(vector<ll> &aib,ll a,ll b){
    return prefsum(aib,b)-prefsum(aib,a-1);
}

int main()
{
    ll n,m,x,y,z;
    fin>>n>>m;
    vector<ll> v(n+1),aib(n+1,0);
    for(ll i=1;i<=n;i++){
        fin>>v[i];
        update(aib,v[i],i);
    }
    for(ll i=0;i<m;i++){
        fin>>x;
        if(x==0){
            fin>>y>>z;
            update(aib,z,y);
        }
        if(x==1){
            fin>>y>>z;
            fout<<srq(aib,y,z)<<'\n';
        }
        if(x==2){
            fin>>y;
            ll i=1,sum=0;
            bool ok=true;
            while(ok && i<=n){
                while(sum+aib[i+(i&(-i))]<=y && i+(i&(-i))<=n){
                    i+=(i&(-i));
                }
                sum+=aib[i];
                if(sum==y){
                    ok=false;
                }
                if(sum>y){
                    ok=false;
                }
                i++;
            }
            if(sum==y){
                fout<<i-1<<'\n';
            }
            else fout<<-1<<'\n';
        }
    }
    return 0;
}