Cod sursa(job #2755909)

Utilizator ViAlexVisan Alexandru ViAlex Data 28 mai 2021 19:22:58
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include<iostream>
#include<fstream>
using namespace std;

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

const int mx=1e5+100;

int n,m;
long long tree[mx];

int lsb(int x){
    return x&(-x);
}

long long query(int x){
    long long total=0;
    while(x){
        total+=tree[x];
        x-=lsb(x);
    }
    return total;
}

void update(int x,long long value){
    while(x<=n){
        tree[x]+=value;
        x+=lsb(x);
    }
}

long long interval(int l,int r){
    long long a=query(r),b=0;
    if(l>1){
        b=query(l-1);
    }
    return a-b;
}

int lower_bound(long long x){
    int l=1,r=n,mid;
    long long aux;
    while(l<r){
        mid=(l+r)/2;
        aux=query(mid);

        if(x<=aux){
            r=mid;
        }
        else{
            l=mid+1;
        }
    }
    if(query(l)==x)
        return l;
    return -1;
}


void read(){
    in>>n>>m;
    long long aux;
    for(int i=1;i<=n;i++){
        in>>aux;
        update(i,aux);
    }
}

void solve(){
    int q;
    long long a,b;
    for(int i=0;i<m;i++){
        in>>q;
        if(q==0){
            in>>a>>b;
            update(a,b);
        }
        else if(q==1){
            in>>a>>b;
            out<<interval(a,b)<<'\n';
        }
        else{
            in>>a;
            out<<lower_bound(a)<<'\n';
        }
    }
}

int main(){
    read();
    solve();
    return 0;
}