Cod sursa(job #2508762)

Utilizator MihneaGhiraMihnea MihneaGhira Data 12 decembrie 2019 22:20:27
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,op,a,b,m,x;
int v[100010];

int query(int i){
    int nr=0;
    for( ; i!=0 ; i-= (i &- i) )
        nr+=v[i];
    return nr;
}

void actualizare(int i,int a) {
    for ( ; i<=n ; i+= (i &- i))
        v[i]+=a;
    return;
}

int patrascu(int i){ ///cautare cu puteri de 2
    int aux;
    int j,st;
    aux=i;
    j=1;
    while(2*j<=n)
        j*=2;
    st=0;
    while(j!=0){

        if(st+j<=n){
            if(v[st+j]<=i){
                st+=j;
                i-=v[st];
                if(i==0)
                    return st;
            }
        }

        j/=2;
    }

    return -1;
}

int main(){
    fin>>n>>m;
    for(int i=1;i<=n;i++){
        fin>>x;
        actualizare(i,x);
    }
    int i;
    for(int t=1;t<=m;t++){
        fin>>op;
        if(op==0){
            fin>>i>>a;
            actualizare(i,a);
        }
        if(op==1){
            fin>>a>>b;
            fout<<query(b)-query(a-1)<<"\n";
        }
        if(op==2){
            fin>>i;
            fout<<patrascu(i)<<"\n";
        }
    }
    return 0;
}