Cod sursa(job #3366817)

Utilizator TheodosiussMiguel Theodosiuss Data 4 octombrie 2026 14:45:13
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;
const int Nmax=1e5+5;
int aib[Nmax];
int v[Nmax];
//g(t)=t&(t-1)
//pt upd: i -> (i|(i-1))+1
int n,a,b;
int sum(int i){
    int s=0;
    while(i>0){
        s+=aib[i];
        i=i&(i-1);
    }
    return s;
}
void upd(int i,int val){
    while(i<=n){
        aib[i]+=val;
        i=(i|(i-1))+1;
    }
}
int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int m,x,st,dr,mid,s;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>v[i];
        upd(i,v[i]);
    }
    for(int i=0;i<m;i++){
        cin>>x;
        if(x==1){
            cin>>a>>b;
            cout<<sum(b)-sum(a-1)<<"\n";
        }
        else if(x==0){
            cin>>a>>b;
            upd(a,b);
        }
        else{
            cin>>a;
            st=1;
            dr=n;
            while(st<=dr){
                mid=(st+dr)>>1;
                s=sum(mid);
                if(s==a){
                    a=-1;
                    cout<<mid<<"\n";
                    break;
                }
                else if(s<a) st=mid+1;
                else dr=mid-1;
            }
            if(a!=-1) cout<<"-1 \n";
        }
    }
    return 0;
}