Cod sursa(job #2755616)

Utilizator pregoliStana Andrei pregoli Data 27 mai 2021 19:49:27
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <bits/stdc++.h>
using namespace std;
const string fileName("datorii");
ifstream fin(fileName + ".in");
ofstream fout(fileName + ".out");
///-------------------------
constexpr int NMAX = 15e3 + 3;
int n, m, arr[NMAX], itree[NMAX * 4];

void getSons(int node, int &leftSon, int &rightSon) {
    leftSon = node * 2;
    rightSon = leftSon + 1;
}

void buildITree(int node, int left, int right) {
    if (left > right) {
        return;
    }
    if (left == right) {
        itree[node] = arr[left];
        return;
    }
    int mid = (left + right) / 2;
    int leftSon, rightSon;
    getSons(node, leftSon, rightSon);
    buildITree(leftSon, left, mid);
    buildITree(rightSon, mid + 1, right);
    itree[node] = itree[leftSon] + itree[rightSon];
}

int query(int node, int left, int right, int qleft, int qright) {
    if (left == qleft && right == qright) {
        return itree[node];
    }
    int mid = (left + right) / 2;
    int leftSon, rightSon;
    getSons(node, leftSon, rightSon);
    if (qright <= mid) {
        return query(leftSon, left, mid, qleft, qright);
    }
    if (qleft > mid) {
        return query(rightSon, mid + 1, right, qleft, qright);
    }
    return query(leftSon, left, mid, qleft, mid) + query(rightSon, mid + 1, right, mid + 1, qright);
}

int pos, value;
void update(int node, int left, int right) {
    if (left == right) {
        itree[node] = value;
        return;
    }
    int mid = (left + right) / 2;
    int leftSon, rightSon;
    getSons(node, leftSon, rightSon);
    if (pos <= mid) {
        update(leftSon, left, mid);
    } else {
        update(rightSon, mid + 1, right);
    }
    itree[node] = itree[leftSon] + itree[rightSon];
}

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        fin >> arr[i];
    }
    buildITree(1, 1, n);
    int a, b;
    bool op;
    while (m--) {
        fin >> op >> a >> b;
        if (!op) {
            int delta = query(1, 1, n, a, a) - b;
            pos = a, value = delta;
            update(1, 1, n);
        } else {
            fout << query(1, 1, n, a, b) << endl;
        }
    }
    fout.close();
    return 0;
}