Cod sursa(job #2960142)

Utilizator Beverita2345Bretan Alexandru Beverita2345 Data 3 ianuarie 2023 17:15:39
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("datorii.in");
ofstream out("datorii.out");

int n, m, x, y;
int datorie[15001], segment_tree[60001];
bool cer;

void build(int node, int l, int r) {
    if (l == r) {
        segment_tree[node] = datorie[l];
    } else {
        int mij = (l + r) / 2;
        build(node * 2, l, mij);
        build(node * 2 + 1, mij + 1, r);

        segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 1];
    }
}

int query(int node, int l, int r, int ql, int qr) {
    if (ql <= l && r <= qr)return segment_tree[node];
    else {
        int mij = (l + r) / 2;
        if (qr <= mij)return query(node * 2, l, mij, ql, qr);
        if (mij + 1 <= ql)return query(node * 2 + 1, mij + 1, r, ql, qr);
        return (query(node * 2, l, mij, ql, qr) + query(node * 2 + 1, mij + 1, r, ql, qr));
    }
}

void update(int node, int l, int r, int zi, int val) {
    if (l == r) segment_tree[node] -= val;
    else {
        int mij = (l + r) / 2;

        if (zi <= mij) update(node * 2, l, mij, zi, val);
        else update(node * 2 + 1, mij + 1, r, zi, val);

        segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 1];
    }
}

int main() {

    in >> n >> m;

    for (int i = 1; i <= n; ++i) in >> datorie[i];

    //for (int i =1; i <= n; ++i)out<<datorie[i]<<' ';

    build(1, 1, n);

    for (int i = 0; i < m; ++i) {
        in >> cer >> x >> y;
        if (cer) {
            out << query(1, 1, n, x, y) << '\n';
        } else {
            update(1, 1, n, x, y);
        }
    }

    return 0;
}