Cod sursa(job #2780667)

Utilizator GligarEsterabadeyan Hadi Gligar Data 7 octombrie 2021 16:51:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

const int nmax=100000;

int v[nmax+1];

int query(int x){
    int sol=0;
    for(int i=x;i>0;i=(i&(i-1))){
        sol+=v[i];
    }
    return sol;
}

int main(){
    int n,m;
    fin>>n>>m;
    int n2=1;
    while(n2*2<=n){
        n2*=2;
    }
    for(int i=1;i<=n;i++){
        int x;
        fin>>x;
        for(int j=i;j<=n;j=2*j-(j&(j-1))){
            v[j]+=x;
        }
    }
    for(int i=1;i<=m;i++){
        int x;
        fin>>x;
        if(x==0){
            int y,z;
            fin>>y>>z;
            for(int j=y;j<=n;j=2*j-(j&(j-1))){
                v[j]+=z;
            }
        }else if(x==1){
            int y,z;
            fin>>y>>z;
            fout<<query(z)-query(y-1)<<"\n";
        }else{
            int y;
            fin>>y;
            int sol=0,s=0;
            for(int i=n2;i>0;i/=2){
                if(sol+i<=n&&s+v[sol+i]<=y){
                    s+=v[sol+i];
                    sol+=i;
                }
            }
            if(s!=y||sol==0){
                sol=-1;
            }
            fout<<sol<<"\n";
        }
    }
    return 0;
}