Cod sursa(job #2740470)

Utilizator DragosC1Dragos DragosC1 Data 13 aprilie 2021 11:22:11
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

struct tripla {
    int op, x, y;
};

int n, m;
tripla Q[100001];
int a[15001], seg[15000 * 4];

void read() {
    int op, x, y;
    ifstream f("datorii.in");
    f >> n >> m;
    int i;
    for (i = 1; i <= n; i++)
        f >> a[i];
    for (i = 1; i <= m; i++) {
        f >> op >> x >> y;
        Q[i].op = op;
        Q[i].x = x;
        Q[i].y = y;
    }
    f.close();
}

void buildTree(int ind, int st, int dr) {
    if (st == dr) {
        seg[ind] = a[st];
        return;
    }

    int mij = (st + dr) / 2;
    
    buildTree(ind * 2, st, mij);
    buildTree(ind * 2 + 1, mij + 1, dr);
    seg[ind] = seg[ind * 2] + seg[ind * 2 + 1];
}

int query(int ind, int st, int dr, int qst, int qdr) {
    if (dr < qst || st > qdr)
        return 0;
    else if (st >= qst && dr <= qdr)
        return seg[ind];
    
    int mij = (st + dr) / 2, s, d;

    s = query(ind * 2, st, mij, qst, qdr);
    d = query(ind * 2 + 1, mij + 1, dr, qst, qdr);
    return s + d;
}

void update(int ind, int st, int dr, int poz, int val) {
    if (st == dr) {
        seg[ind] -= val;
        return ;
    }

    int mij = (st + dr) / 2;

    if (mij >= poz)
        update(ind * 2, st, mij, poz, val);
    else update(ind * 2 + 1, mij + 1, dr, poz, val);

    seg[ind] = seg[ind * 2] + seg[ind * 2 + 1];
}

void solve() {
    buildTree(1, 1, n);
}

void output() {
    ofstream g("datorii.out");
    int i;
    for (i = 1; i <= m; i++) {
        if (Q[i].op == 1) 
            g << query(1, 1, n, Q[i].x, Q[i].y) << '\n';
        else 
            update(1, 1, n, Q[i].x, Q[i].y);
    }
    g.close();
}

int main() {
    read();
    solve();
    output();
    return 0;
}