Cod sursa(job #2693954)

Utilizator Arsene_DenisaArsene Denisa Arsene_Denisa Data 7 ianuarie 2021 18:06:12
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include<fstream>
using namespace std;

int n, q, i, c, a, b, s;
int len(int x) {
    return x-(x&(x-1));
}
int sum[100001], v[100001];

void solve(int poz, int val){
    while(poz<=n) {
             sum[poz]+=val;
            poz=poz+len(poz);
    }
}
int query(int poz) {
    int ss=0;
    while(poz>0) {
            ss=ss+sum[poz];
            poz=poz-len(poz);
    }
    return ss;
}


int main() {
    int l, med;

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

    return 0;
}