Cod sursa(job #3366821)

Utilizator TheodosiussMiguel Theodosiuss Data 4 octombrie 2026 15:21:14
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 pw=1,temp,pos;
int sum(int i){
    int s=0;
    while(i>0){
        s+=aib[i];
        i=i&(i-1);
    }
    return s;
}
int check(int val){
    int sm=0;
    temp=pw;
    pos=0;
    while(temp>0){
        if(pos+temp<=n&&aib[pos+temp]+sm<val){
            pos=pos+temp;
            sm+=aib[pos];
        }
        temp>>=1;
    }
    if(pos+1>n||v[pos+1]+sm!=val) return -1;
    return pos+1;
}
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;
    while(pw<n) pw<<=1;
    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;
            v[a]+=b;
            upd(a,b);
        }
        else{
            cin>>a;
            cout<<check(a)<<"\n";
        }
    }
    return 0;
}