Cod sursa(job #3258782)

Utilizator nicushor21Pirlog Marian Nicolae nicushor21 Data 23 noiembrie 2024 16:31:45
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
long long n,m,x,y,i,j,k,c,aib[100001];
bool ok;
void update(int p, int val){
    for(;p<=n;p+=(p&-p))
        aib[p] += val;
}
long long query(int p){
    long long sum=0;
    for(;p>0;p-=(p&-p))
        sum += aib[p];
    return sum;
}
int main()
{
    ios::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>x,update(i,x);
    while(m--){
        fin>>c;
        if(c == 0){
            fin>>x>>y;
            update(x, y);
        }else if(c == 1){
            fin>>x>>y;
            fout<<query(y)-query(x-1)<<'\n';
        }else{
            fin>>x;
            ok=0;
            for(k=(1<<18),i=0; k; k >>= 1){
                if(i+k>n)
                    continue;
                if(aib[i+k]<=x){
                    i += k;
                    x -= aib[i];
                    if(!x){
                        ok=1;
                        fout<<i<<'\n';
                    }
                }
            }
            if(!ok)
                fout<<"-1\n";
        }
    }
    return 0;
}