Cod sursa(job #2969931)

Utilizator tiberia_farkasFarkas Tiberia tiberia_farkas Data 23 ianuarie 2023 21:43:55
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>

using namespace std;

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

int v[400001], segment_tree[400001], n;

void build(int node, int left, int right) {
    if ( left == right ) {
        segment_tree[node] = v[left];
    } else {
        int middle = ( left + right ) / 2;
        build(node * 2, left, middle);
        build(node * 2 + 1, middle + 1, right);
        segment_tree[node] = segment_tree[node*2] + segment_tree[node * 2 + 1];
    }
}

void update(int node, int left, int right, int pos, int value) {
    if ( left == right ) {
        segment_tree[node] = value;
    } else {
        int middle = ( left + right ) / 2;
        if ( pos <= middle )
            update(node * 2, left, middle, pos, value);
        else update(node * 2 + 1, middle + 1, right, pos, value);
        segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 1];
    }
}

int query(int node, int left, int right, int qleft, int qright) {
    if ( qleft <= left && right <= qright ) return segment_tree[node];
    else {
        int middle = ( left + right ) / 2;
        if ( qright <= middle )
            return query(node * 2, left, middle, qleft, qright);
        if ( middle + 1 <= qleft )
            return query(node * 2 + 1, middle + 1, right, qleft, qright);
        return query(node * 2, left, middle, qleft, qright) + query(node * 2 + 1, middle + 1, right, qleft, qright);
    }
}

int main() {
    int i, m, c, a, b;
    fin >> n >> m;
    for ( i = 1; i <= n; ++i ) {
        fin >> v[i];
    }
    build(1, 1, n);
    for ( i = 1; i <= m; ++i ) {
        fin >> c;
        fin >> a >> b;
        if ( !c ) update(1, 1, n, a, v[a] - b);
        if ( c ) fout << query(1, 1, n, a, b) << '\n';
    }
    return 0;
}