Cod sursa(job #3316695)

Utilizator vlad7654vladimir manescu vlad7654 Data 20 octombrie 2025 08:43:19
Problema Arbori indexati binar Scor 100
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");
struct aib{
    vector<int> vaib;
    aib(int n)
    :vaib(n+1)
    {

    }
    void update(int node, int value, int n){
        for(;node<=n;node+=node&(-node)){
            vaib[node]+=value;
        }
    }
    int query(int node, int n){
        int ans=0;
        for(;node>=1;node-=node&(-node)){
            ans+=vaib[node];
        }
        return ans;
    }
    int cautare_binara(int value, int n){
        int ans=0, sum_cur=0;
        for(int step=(1<<30);step>0;step>>=1){
            if(ans+step<n and sum_cur+vaib[ans+step]<value){
                ans+=step;
                sum_cur+=vaib[ans];
            }
        }
        if(ans+1>n or query(ans+1, n)!=value){
            return -1;
        }
        return ans+1;
    }
};
int main(){
    int n, q;
    fin>>n>>q;
    aib ans(n);
    for(int i=1;i<=n;i++){
        int val;
        fin>>val;
        ans.update(i, val, n);
    }
    for(int i=1;i<=q;i++){
        int tip;
        fin>>tip;
        if(tip==0){
            int node, val;
            fin>>node>>val;
            ans.update(node, val, n);
        }else if(tip==1){
            int a, b;
            fin>>a>>b;
            if(a>b){
                swap(a,b);
            }
            fout<<abs(ans.query(a-1, n)-ans.query(b, n))<<'\n';
        }else if(tip==2){
            int value;
            fin>>value;
            fout<<ans.cautare_binara(value, n)<<'\n';
        }
    }
}