Cod sursa(job #2449714)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 20 august 2019 15:33:17
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 in("aib.in");
ofstream out("aib.out");
const int NMAX=100002;
#define zeros(x) x&-x
int aib[NMAX],n,m;
void update(int poz,int val){
    for(poz;poz<=n;poz+=zeros(poz))
        aib[poz]+=val;
}
int compute(int poz){
    int sum=0;
    for(poz;poz;poz-=zeros(poz))
        sum+=aib[poz];
    return sum;
}
int Find(int val){
    int bit,poz=0,i;
    for(bit=1;bit<n;bit<<=1);
    for( i=0;bit;bit>>=1){
        if(i+bit<=n && aib[i+bit]<=val){
            val-=aib[i+bit];
            i+=bit;
        }
    }
    if(val)
        return -1;
    return i;
}
int main()
{
    in>>n>>m;
    int val,tip,x,y;
    for(int i=1;i<=n;i++){
        in>>val;
        update(i,val);
    }
    for(int i=1;i<=m;i++){
        in>>tip;
        if(tip==0){
            in>>x>>y;
            update(x,y);
        }
        else if(tip==1){
            in>>x>>y;
            out<<compute(y)-compute(x-1)<<'\n';

        }
        else{
            in>>x;
            if(!x){
                out<<-1<<'\n';
                continue;
                }
            out<<Find(x)<<'\n';
        }
    }
    return 0;
}