Cod sursa(job #2998906)

Utilizator CipriEuCruceanu Ciprian Constantin CipriEu Data 10 martie 2023 11:18:35
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int w[100001], n, m, x, y, z;
int v[250001];

void afis(){
    for(int i=1; i<=n*2+1; i++)
        cout<<v[i]<<" ";
    cout<<"\n";
}

void add(int poz, int val, int st, int dr, int k){
    if(st==dr) {v[k] = val; cout<<"v["<<poz<<"] = "<<val<<", k = "<<k<<"\n";}
    else {
        int m = (st+dr)/2;
        if(m >= poz) add(poz, val, st, m, k*2);
        if(m < poz) add(poz, val, m+1, dr, k*2+1);
        v[k] = v[k*2]+v[k*2+1];
    }
}

int sum(int a, int b, int st, int dr, int k){
    //cout<<st<<" "<<dr<<"\n";
    if(a<=st && dr<=b) return v[k];
    int m=(st+dr)/2;
    long long temp=0;
    if(m >= a) temp += sum(a, b, st, m, k*2);
    if(m < b) temp += sum(a, b, m+1, dr, k*2+1);
    return temp;
}

int check(long long k){
    long long s=0;
    for(int i=1; i<=n; i++){
        s+=w[i];
        if(s == k) return i;
        else if(s>k) return -1;
    }
}

int main(){
    fin>>n>>m;
    for(int i=1; i<=n; i++){
        fin>>w[i];
        add(i, w[i], 1, n, 1);
        afis();
    }
    cout<<"------\n";
    for(int i=1; i<=m; i++){
        fin>>x;
        if(!x){
            fin>>y>>z;
            add(y, z, 1, n, 1);
            afis();
        }
        else if(x==1){
            fin>>y>>z;
            fout<<sum(y, z, 1, n, 1)<<"\n";
            cout<<"\n";
        }
        else{
            fin>>y;
            fout<<check(y)<<"\n";
        }
    }
}