Cod sursa(job #2998937)

Utilizator CipriEuCruceanu Ciprian Constantin CipriEu Data 10 martie 2023 11:41:54
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int w[100001], n, m, x, y, z;
long v[250001];
void add(int poz, int val, int st, int dr, int k){
    if(st==dr) v[k] += val;
    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){
    if(a<=st && dr<=b) return v[k];
    int m=(st+dr)/2;
    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;
    }
    return -1;
}

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