Cod sursa(job #2952111)

Utilizator vlad79xVlad79X vlad79x Data 8 decembrie 2022 12:34:51
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 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);
                        }
                }
                if(ans>n||queryPref(ans)!=x||s!=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;
}