Cod sursa(job #3002343)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 14 martie 2023 17:42:54
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 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];

class AIB{
    int aib[dim];
    inline int lsb(int x){
        return x&(-x);
    }
public:
    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;
    }
}aib;

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

int Search(int x){

    int st=1,dr=n;
    while(st<=dr){
        int mij=(st+dr)/2;
        if(suma(1,mij)<=x){
            st=mij+1;
            if(suma(1,mij)==x)
                return mij;
        }
        else{
            dr=mij-1;
        }
    }
    return -1;
}

signed main(){

        fin>>n>>m;
    for(int i=1;i<=n;i++){
        fin>>v[i];
        aib.Update(i,v[i]);
    }

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