Cod sursa(job #3152054)

Utilizator mihai03Mihai Grigore mihai03 Data 23 septembrie 2023 17:25:27
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#include <iostream>
using namespace std;

int n, m;
int datorii[15001];
int segment_tree[60001];

void build(int node, int left, int right) {
    if (left == right) {
        segment_tree[node] = datorii[left];
    }
    else {
        int mid = (left + right) / 2;
        build(2 * node, left, mid);
        build(2 * node + 1, mid + 1, right);

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

void update(int node, int left, int right, int position, int new_value) {
    if (left == right) {
        segment_tree[node] -= new_value;
    }
    else {
        int middle = (left + right) / 2;
        if (position <= middle) {
            update(2 * node, left, middle, position, new_value);
        }
        else {
            update(2 * node + 1, middle + 1, right, position, new_value);
        }
        segment_tree[node] = segment_tree[2 * node] + segment_tree[2 * node + 1];
    }
}

int query(int node, int left, int right, int query_left, int query_right)
{
  if (query_left <= left and right <= query_right) {
    return segment_tree[node];
  } else {
    int middle = (left + right) / 2;

    if (query_right <= middle)
      return query(node * 2, left, middle, query_left, query_right);
    if (middle + 1 <= query_left)
      return query(node * 2 + 1, middle + 1, right, query_left, query_right);

    return query(node * 2, left, middle, query_left, query_right) +
           query(node * 2 + 1, middle + 1, right, query_left, query_right);
  }
}

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

    f >> n >> m;
    for (int i = 1; i <= n; ++i)
        f >> datorii[i];

    build(1, 1, n);

    for (int i = 1; i <= m; ++i) {
        int code;
        f >> code;

        if (code == 0) {
            int day, value;
            f >> day >> value;
            update(1, 1, n, day, value);
        }
        else if (code == 1) {
            int start_date, end_date;
            f >> start_date >> end_date;
            g << query(1, 1, n, start_date, end_date) << "\n";
        }
    }
    return 0;
}