Cod sursa(job #2957991)

Utilizator vlad79xVlad79X vlad79x Data 24 decembrie 2022 00:29:54
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax=100000;
int lsb(int x) {return x&(-x);}

struct AIB {
    int aib[nmax+1],n;
    void update(int poz,int val) {
        for(; poz<=n; poz+=lsb(poz))
            aib[poz]+=val;
    }
    int queryPref(int poz) {
        int s=0;
        for(; poz>0; poz-=lsb(poz))
            s+=aib[poz];
        return s;
    }
    int query(int st,int dr) {
        return queryPref(dr)-queryPref(st-1);
    }
    int search(int x){
        int s=0,ans=0;
        for(int i=24;i>=0;i--){
            if(ans+(1<<i)<=n && s+aib[ans+(1<<i)] < x){
                s+=aib[ans+(1<<i)];
                ans+=(1<<i);
            }
        }
        ans++;
        if(ans>n || queryPref(ans)!=x)
            return -1;
        return ans;
    }
};

int main() {
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int n,q,x,y,t;
    AIB aib;
    cin>>n>>q;
    aib.n=n;
    for(int i=1; i<=n; i++) {
        cin>>x;
        aib.update(i,x);
    }
    for(int i=1; i<=q; i++) {
        cin>>t>>x;
        if(t==0) {
            cin>>y;
            aib.update(x,y);
        } else if(t==1) {
            cin>>y;
            cout<<aib.query(x,y)<<"\n";
        } else {
            cout<<aib.search(x)<<"\n";
        }
    }
    return 0;
}