Cod sursa(job #2766163)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 31 iulie 2021 12:08:12
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>
using namespace std;

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

const int dim=100009;

int n,m,v[dim];
int aib[dim];

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

void Update(int pos,int val){
    for(int i=pos;i<=n;i+=lsb(i)){
        aib[i]+=val;
    }
}

int Query(int pos){
    int sum=0;
    for(int i=pos;i>=1;i-=lsb(i)){
        sum+=aib[i];
    }
    return sum;
}

int suma(int st,int dr){
    return Query(dr)-Query(st-1);
}

int Search(int x){
    int retine=0;
    int st=1,dr=n;
    while(st<=dr){
        int mij=(st+dr)/2;
        if(suma(1,mij)<=x){
            st=mij+1;
            retine=mij;
        }
        else{
            dr=mij-1;
        }
    }
    if(suma(1,retine)!=x)
        retine=-1;
    fout<<retine<<'\n';

}

signed main(){

        fin>>n>>m;
    for(int i=1;i<=n;i++){
        fin>>v[i];
        Update(i,v[i]);
    }
    for(int i=1;i<=m;i++){
        int c;
        fin>>c;
        if(c==0){
            int a,b;
            fin>>a>>b;
            Update(a,b);
        }
        if(c==1){
            int a,b;
            fin>>a>>b;
            fout<<suma(a,b)<<'\n';
        }
        if(c==2){
            int a;
            fin>>a;
            Search(a);
        }
    }
}