Cod sursa(job #2591290)

Utilizator Ioana_GaborGabor Ioana Ioana_Gabor Data 30 martie 2020 11:59:18
Problema Arbori indexati binar Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb

#include <iostream>
#include <fstream>
#define NMAX 100000

using namespace std;

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

int n,q,AIB[NMAX+5],sir[NMAX+5],a,b,cerinta;

void adauga(int val,int poz){
    while(poz<=n){
        AIB[poz]+=val;
        poz+=(poz^((poz-1)&poz));
    }
}

int suma(int poz){
    int suma=0;
    while(poz>0){
        suma+=AIB[poz];
        poz-=(poz^((poz-1)&poz));
    }
    return suma;
}

int cauta(int val){
    int pas=(1<<17);
    int rez=0,suma=0;
    while(pas){
        if(rez+pas<=n&&suma+AIB[rez+pas]<val){
            rez+=pas;
            suma+=AIB[rez];
        }
        pas>>=1;
    }
    rez++;
    suma+=sir[rez];
    if(suma==val){
        return rez;
    }else{
        return -1;
    }
}

int main(){
    f>>n>>q;
    for(int i=1;i<=n;i++){
        f>>sir[i];
        adauga(sir[i],i);
    }
    while(q--){
        f>>cerinta>>a;
        if(cerinta!=2){
            f>>b;
        }
        if(cerinta==0){
            adauga(b,a);
        }else if(cerinta==1){
            g<<suma(b)-suma(a-1)<<'\n';
        }else{
            g<<cauta(a)<<'\n';
        }
    }
    f.close();
    g.close();
}