Cod sursa(job #2891062)

Utilizator hobbitczxdumnezEU hobbitczx Data 17 aprilie 2022 13:52:30
Problema Datorii Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3F3F3F3F
using namespace std;

const string fisier = "datorii";

ifstream fin (fisier + ".in");
ofstream fout (fisier + ".out");

const int N_MAX = 15005;

int n , a[N_MAX] , q , arb[4 * N_MAX];
long long ans;
void build(int st , int dr , int node){
    if (st == dr){
        arb[node] = a[st];
        return;
    }
    int mij = (st + dr) / 2;
    build(st , mij , 2 * node);
    build(mij + 1 , dr , 2 * node + 1);
    arb[node] = arb[2 * node] + arb[2 * node + 1];
}

void update (int node , int st , int dr , int poz , int val){
    if (st == dr){
        arb[node] -= val;
        return;
    }
    int mij = (st + dr) / 2;
    if (poz <= mij){
        update(2 * node , st , mij , poz , val);
    }
    else{
        update(2 * node + 1 , mij + 1 , dr , poz , val);
    }
    arb[node] = arb[2 * node] + arb[2 * node + 1];
}

void query (int node , int st , int dr , int Qst , int Qdr){
    if (Qst <= st && dr <= Qdr){
        ans += arb[node];
        return;
    }
    int mij = (st + dr) / 2;
    if (Qst <= mij){
        query(2 * node , st , mij , Qst , Qdr);
    }
    if (mij + 1 <= Qdr){
        query(2 * node + 1 , mij + 1 , dr , Qst , Qdr);
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    fin >> n >> q;
    for (int i=1; i<=n; i++){
        fin >> a[i];
    }
    build(1 , n , 1);
    while (q--){
        int op , l , r; fin >> op >> l >> r;
        if (op == 1){
            ans = 0;
            query(1 , 1 , n , l , r);
            fout << ans << '\n';
        }
        else{
            update(1 , 1 , n , l , r);
        }
    }
}