Cod sursa(job #1803046)

Utilizator alexandru.jercaianuJercaianu Alexandru alexandru.jercaianu Data 10 noiembrie 2016 21:51:33
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<iostream>
#include<vector>
#include<fstream>

using namespace std;

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

vector<int> arb, arr;
int n, m;

void buildTree(int left, int right, int ind) {
    if (left == right) {
        arb[ind] = arr[left];
        return ;
    }

    int mid = left + (right - left) / 2;
    buildTree(left, mid, 2 * ind);
    buildTree(mid + 1, right, 2 * ind + 1);
    arb[ind] = arb[2 * ind] + arb[2 * ind + 1];
}

void update(int index, int val, int left, int right, int ind) {
    if (left == right) {
        arb[ind] -= val;
        return;
    }

    int mid = left + (right - left) / 2;
    if (index <= mid)
        update(index, val, left, mid, 2 * ind);
    else
        update(index, val, mid + 1, right, 2 * ind + 1);
    arb[ind] = arb[2 * ind] + arb[2 * ind + 1];
}

int getSize()
{
    int size = 1;
    while (size < n)
        size <<= 1;
    return size << 1;
}

int query(int left, int right, int lo, int hi, int ind) {
    if (left >= lo && right <= hi) {
        return arb[ind];
    }

    int mid = left + (right - left) / 2;
    int qleft = 0, qright = 0;

    if (lo <= mid) 
        qleft = query(left, mid, lo, hi, 2 * ind);
    if (hi > mid)
        qright = query(mid + 1, right, lo, hi, 2 * ind + 1);

    return qleft + qright;
}

int main() 
{
    fin >> n >> m;
    arr.resize(n);
    arb.resize(getSize());
    for (int i = 0; i < n; i++) {
        fin >> arr[i];
    }
    buildTree(0, n-1, 1); 
    for (int i = 0; i < m; i++) {
        int type, a, b;
        fin >> type >> a >> b;
        if (type) {
            fout << query(0, n - 1, a - 1, b - 1, 1) << '\n';
        } else {
            update(a - 1, b, 0, n - 1, 1); 
        }
    }
}