Cod sursa(job #2563579)

Utilizator Arsene_DenisaArsene Denisa Arsene_Denisa Data 1 martie 2020 12:38:44
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include<fstream>

int s[100001], sm[100001], n;
int len(int x) {
    return x-(x&(x-1));
}
int query(int pz) {
    int sum=0;
    while(pz>0) {
        sum+=s[pz];
        pz=pz-len(pz);
    }
    return sum;
}
void solve(int pz, int val) {
    while(pz<=n) {
            s[pz]+=val;
    pz+=len(pz);
    }
}

using namespace std;

int main() {
    int m, a, b, i, nr, c, p, j, l, med;

    ifstream fin("aib.in");
    ofstream fout("aib.out");
    fin>>n>>m;
    for(i=1;i<=n;i++) {
            fin>>nr;
            solve(i, nr);
    }
    for(i=1;i<=m;i++) {
            fin>>c;
    if(c==0 || c==1) {
            fin>>a>>b;
            if(c==0) {
                    solve(a, b);
            }
            if(c==1) {
                    fout<<query(b)-query(a-1)<<endl;
            }
    }
    else {
            fin>>a;
            if(a==0) {
                    fout<<"-1";
            }
            else {
                    l=0;
            med=1<<20;
            while(med) {
                    if(l+med<=n && a>=s[l+med]) {
                            l=l+med;
                            a=a-s[l];
                    }
                    med=med/2;

            }
            if(a==0) {
                    fout<<l<<endl;
            }
            else {
                    fout<<"-1"<<endl;

    }
    }
    }
    }

    return 0;
}