Cod sursa(job #3213151)

Utilizator Victor2006Nicola Victor-Teodor Victor2006 Data 12 martie 2024 16:41:23
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <stdio.h>
#include <vector>
#define N 15000

struct Node {
    int sum = 0;
    Node() {
        sum = 0;
    }
    Node(int s) {
        sum = s;
    }
};

Node add(Node a, Node b) {
    return Node(a.sum + b.sum);
}

struct SegTree {
    int leaf_offset;
    std::vector <Node> aint;

    SegTree(int n) {
        leaf_offset = 1;
        while ( leaf_offset <= n )
            leaf_offset *= 2;
        aint.resize(leaf_offset * 2);
    }

    inline int get_left_son(int n) { return n * 2; }
    inline int get_right_son(int n) { return n * 2 + 1; }

    void _update(int val, int pos) {
        pos += leaf_offset;
        aint[pos].sum -= val;
        while ( pos > 1 ) {
            pos /= 2;
            aint[pos] = add(aint[pos * 2], aint[pos * 2 + 1]);
        }
    }

    inline void update(int val, int pos) {
        _update(val, pos);
    }

    Node _query(int node, int left, int right, int qleft, int qright) {
        if ( right < qleft || left > qright )
            return Node{};
        if ( qleft <= left && right <= qright )
            return aint[node];
        
        int middle = (left + right) / 2;
        Node left_son = _query(get_left_son(node), left, middle, qleft, qright);
        Node right_son = _query(get_right_son(node), middle + 1, right, qleft, qright);
        return add(left_son, right_son);
    }

    inline int query(int left, int right) {
        return _query(1, 0, leaf_offset - 1, left, right).sum;
    }

    void init(int n, int v[]) {
        for ( int i = 0; i < n; i ++ ) {
            update(-v[i], i);
        }
    }
};

int v[N];

int main() {
    FILE *fin, *fout;
    int q, x, y, n, nq;

    fin = fopen("datorii.in", "r");
    fout = fopen("datorii.out", "w");
    fscanf(fin, "%d%d", &n, &nq);
    SegTree segtree(n);
    for ( int i = 0; i < n; i ++ )
        fscanf(fin, "%d", &v[i]);
    segtree.init(n, v);
    for ( int i = 0; i < nq; i ++ ) {
        fscanf(fin, "%d%d%d", &q, &x, &y);
        if ( q == 0 ) {
            segtree.update(y, x - 1);
        }
        else
            fprintf(fout, "%d\n", segtree.query(x - 1, y - 1));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}