Cod sursa(job #3159685)

Utilizator radu._.21Radu Pelea radu._.21 Data 21 octombrie 2023 19:48:43
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <algorithm>

const int N = 15000;

int debt[N + 1];
int segment_tree[N * 4 + 1];

void build(int node, int left, int right)
{
  if (left == right) {
    segment_tree[node] = debt[left];
  } else {
    int middle = (left + right) / 2;

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

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

void update(int node, int left, int right, int day, int value)
{
  if (left == right) {
    segment_tree[node] -= value;
  } else {
    int middle = (left + right) / 2;

    if (day <= middle)
      update(node * 2, left, middle, day, value);
    else
      update(node * 2 + 1, middle + 1, right, day, value);

    segment_tree[node] = segment_tree[node * 2] + segment_tree[node * 2 + 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(int argc, const char *argv[])
{
  std::ifstream in("datorii.in");
  std::ofstream out("datorii.out");

  int n, q;
  in >> n >> q;

  for (int i = 1; i <= n; ++i)
    in >> debt[i];
  build(1, 1, n);

  while (q--) {
    int t;
    in >> t;

    if (t == 0) { // we pay 'value' money in day 'day'
      int day, value;
      in >> day >> value;
      update(1, 1, n, day, value);
    } else { // return the amount of money that we have to pay between days 'left' and 'right'
      int left, right;
      in >> left >> right;
      out << query(1, 1, n, left, right) << "\n";
    }
  }

  return 0;
}