Cod sursa(job #2224264)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 23 iulie 2018 15:53:09
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>
#define all(cont) cont.begin(), cont.end()
#define pb push_back
#define fi first
#define se second

using namespace std;

typedef pair <int, int> pii;
typedef vector <int> vi;
typedef long long ll;
typedef unsigned long long ull;

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

const int NMAX = 15005;
int segmTree[4 * NMAX];
int v[NMAX];

void build (int node, int left, int right) {
    if (left == right) {
        segmTree[node] = v[left];
        return;
    }
    int mid = left + (right - left) / 2;
    build (2 * node + 1, left, mid);
    build (2 * node + 2, mid + 1, right);
    segmTree[node] = segmTree[2 * node + 1] + segmTree[2 * node + 2];
}

void update (int node, int left, int right, int pos, int val) {
    if (left == right) {
        segmTree[node] -= val;
        return;
    }
    int mid = left + (right - left) / 2;
    if (pos <= mid) {
        update (2 * node + 1, left, mid, pos, val);
    } else {
        update (2 * node + 2, mid + 1, right, pos, val);
    }
    segmTree[node] = segmTree[2 * node + 1] + segmTree[2 * node + 2];
}

int query (int node, int left, int right, int x, int y) {
    if (x <= left && right <= y) {
        return segmTree[node];
    }
    int mid = left + (right - left) / 2;
    if (y <= mid) {
        return query (2 * node + 1, left, mid, x, y);
    }
    if (x > mid) {
        return query (2 * node + 2, mid + 1, right, x, y);
    }
    return query (2 * node + 1, left, mid, x, y) + query (2 * node + 2, mid + 1, right, x, y);
}

int main() {
    int n, m;
    f >> n >> m;
    for (int i = 0; i < n; ++i) f >> v[i];
    build (0, 0, n - 1);
    while (m--) {
        int type, p, q;
        f >> type >> p >> q;
        --p;
        if (type) {
            --q;
            g << query (0, 0, n - 1, p, q) << '\n';
        } else {
            update (0, 0, n - 1, p, q);
        }
    }

    f.close();
    g.close();
    return 0;
}