Cod sursa(job #2924711)

Utilizator andreipirjol5Andrei Pirjol andreipirjol5 Data 9 octombrie 2022 10:47:26
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <cstdio>
#include <cmath>
#include <vector>

using namespace std;
FILE *fin, *fout;

const int NMAX = 15000;
int v[NMAX + 5], n;

vector <int> segmtree;
int last_row;

void build(int node, int left = 1, int right = last_row)
{
    if(left == right and left > n)
    {
        segmtree[node] = 0;
        return;
    }

    if(left == right)
    {
        segmtree[node] = v[left];
        return;
    }

    int mid = (left + right) / 2;

    build(2 * node, left, mid);
    build(2 * node + 1, mid + 1, right);

    segmtree[node] = segmtree[2 * node] + segmtree[2 * node + 1];
}

void update(int day, int value, int node = 1, int left = 1, int right = last_row)
{
    if(left == right and left > n)
    {
        segmtree[node] = 0;
        return;
    }

    if(left == right)
    {
        segmtree[node] -= value;
        return;
    }

    int mid = (left + right) / 2;

    if(day <= mid)

        update(day, value, 2 * node, left, mid);
    else
        update(day, value, 2 * node + 1, mid + 1, right);

    segmtree[node] = segmtree[2 * node] + segmtree[2 * node + 1];
}

int query(int q_left, int q_right, int node = 1, int left = 1, int right = last_row)
{
    if(q_left <= left and q_right >= right)
        return segmtree[node];

    int mid = (left + right) / 2;
    int leftans = 0, rightans = 0;

    if(q_left <= mid)
        leftans += query(q_left, q_right, 2 * node, left, mid);

    if(q_right > mid)
        rightans += query(q_left, q_right, 2 * node + 1, mid + 1, right);

    return leftans + rightans;
}

int main()
{
    fin = fopen("datorii.in", "r");
    fout = fopen("datorii.out", "w");

    int q;
    fscanf(fin, "%d%d", &n, &q);
    int i;
    for(i = 1; i <= n; i++)
        fscanf(fin, "%d", &v[i]);

    int exp = log2(n), nodes;

    if(1 << exp == n)
        nodes = 2 * (1 << exp) - 1;
    else
    {
        exp++;
        nodes = 2 * (1 << exp) - 1;
    }

    segmtree.resize(nodes + 5);

    last_row = 1 << exp;

    build(1, 1, last_row);

    int a, b , test;

    for(i = 1; i <= q; i++)
    {
        fscanf(fin, "%d%d%d", &test, &a, &b);

        if(test == 0)
            update(a, b);
        else fprintf(fout, "%d\n", query(a, b));
    }

    fclose(fin);
    fclose(fout);
    return 0;
}