Cod sursa(job #2493549)

Utilizator mirceaisherebina mircea mirceaishere Data 16 noiembrie 2019 14:03:21
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb

#include <fstream>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");

int n, m, i, j, a[100002], x, t;

void update(int indice, int nr){
    while(indice<=n){
        a[indice]+=nr;
        indice+=(indice&-indice);
    }
}

int suma(int indice){
    int s=0;
    while(indice>0){
        s+=a[indice];
        indice-=(indice&-indice);
    }
    return s;
}

int main(){
    fin>>n>>m;
    for(i=1; i<=n; i++){
        fin>>x;
        update(i, x);
    }
    for(i=1; i<=m; i++){
        fin>>t;
        if(t==0){
            int p, val;
            fin>>p>>val;
            update(p, val);
        }
        if(t==1){
            int st, dr;
            fin>>st>>dr;
            fout<<suma(dr)-suma(st-1)<<"\n";
        }
        if(t==2){
            int sumacautata;
            fin>>sumacautata;
            if(sumacautata==0){
                fout<<"-1"<<"\n";
            }else{
                int st=0;
                int dr=n+1;
                while(st<=dr){
                    int mid=(st+dr)/2;
                    if(suma(mid)<sumacautata){
                        st=mid+1;
                    }else{
                        dr=mid-1;
                    }
                }
                if(suma(st)==sumacautata){
                    fout<<st<<"\n";
                }else{
                    fout<<"-1"<<"\n";
                }
            }
        }
    }
}