Cod sursa(job #1858132)

Utilizator Dupree7FMI Ciobanu Andrei Dupree7 Data 27 ianuarie 2017 01:39:17
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>

using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");
int N, M, v[15001], sgm_tree[15000 << 2];

void calculate(int node)
{
    sgm_tree[node] = sgm_tree[node << 1] + sgm_tree[(node << 1) + 1];
}

void build_sgm_tree(int node, int left, int right)
{
    if(left != right)
    {
        int mid = (left + right) >> 1;
        build_sgm_tree(node << 1, left, mid);
        build_sgm_tree((node << 1) + 1, mid + 1, right);
        calculate(node);
    }
    else
    {
        sgm_tree[node] = v[left];
    }
}

void update(int node, int left, int right, int x, int y)
{
    if(left == right)
    {
        sgm_tree[node] -= y;
    }
    else
    {
        int mid = (left + right) >> 1;
        if(x <= mid)
            update(node << 1, left, mid, x, y);
        else
            update((node << 1) + 1, mid + 1, right, x, y);

        calculate(node);
    }
}

int query(int node, int left, int right, int x, int y)
{
    if(x <= left && right <= y)
        return sgm_tree[node];
    else
    {
        int mid = (left + right) >> 1;

        int answer = 0;

        if(x <= mid && y > mid)
            answer += (query(node << 1, left, mid, x, mid) + query((node << 1) + 1, mid + 1, right, mid + 1, y));
        else if(y <= mid)
            answer += query(node << 1, left, mid, x, y);
        else if(x > mid)
            answer += query((node << 1) + 1, mid + 1, right, x, y);

        return answer;
    }
}


int main()
{
    int i, a, b, ok;
    f >> N >> M;

    for(i = 1; i < N + 1; i++)
        f >> v[i];

    build_sgm_tree(1, 1, N);

    for(i = 0; i < M; i++)
    {
        f >> ok >> a >> b;

        if(ok)
            g << query(1, 1, N, a, b) << "\n";
        else
            update(1, 1, N, a, b);
    }

    return 0;
}