Cod sursa(job #2816380)

Utilizator Teodor94Teodor Plop Teodor94 Data 11 decembrie 2021 12:22:58
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
// Arbori intervale

#include <stdio.h>

#define MAX_N 15000

#define UPDATE 0
#define QUERY 1

int v[MAX_N];

int aint[MAX_N * 2];

void build(int node, int nLeft, int nRight) {
  if (nLeft == nRight) {
    aint[node] = v[nLeft];
    return;
  }

  int nMid, leftSon, rightSon;

  nMid = (nLeft + nRight) / 2;
  leftSon = node + 1;
  rightSon = node + 2 * (nMid - nLeft + 1);

  build(leftSon, nLeft, nMid);
  build(rightSon, nMid + 1, nRight);

  aint[node] = aint[leftSon] + aint[rightSon];
}

void update(int node, int nLeft, int nRight, int pos, int value) {
  if (nLeft == nRight) {
    aint[node] = value;
    return;
  }

  int nMid, leftSon, rightSon;

  nMid = (nLeft + nRight) / 2;
  leftSon = node + 1;
  rightSon = node + 2 * (nMid - nLeft + 1);

  if (pos <= nMid)
    update(leftSon, nLeft, nMid, pos, value);
  else
    update(rightSon, nMid + 1, nRight, pos, value);

  aint[node] = aint[leftSon] + aint[rightSon];
}


int query(int node, int nLeft, int nRight, int qLeft, int qRight) {
  if (qLeft <= nLeft && qRight >= nRight)
    return aint[node];

  int nMid, leftSon, rightSon;
  int result;

  nMid = (nLeft + nRight) / 2;
  leftSon = node + 1;
  rightSon = node + 2 * (nMid - nLeft + 1);

  result = 0;

  if (qLeft <= nMid)
    result += query(leftSon, nLeft, nMid, qLeft, qRight);

  if (nMid < qRight)
    result += query(rightSon, nMid + 1, nRight, qLeft, qRight);

  return result;
}

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

  int n, m, i, type, a, b;

  fscanf(fin, "%d%d", &n, &m);
  for (i = 0; i < n; ++i)
    fscanf(fin, "%d", &v[i]);

  build(0, 0, n - 1);

  while (m--) {
    fscanf(fin, "%d%d%d", &type, &a, &b);

    if (type == UPDATE) {
      v[a - 1] -= b;
      update(0, 0, n - 1, a - 1, v[a - 1]);
    } else if (type == QUERY)
      fprintf(fout, "%d\n", query(0, 0, n - 1, a - 1, b - 1));
  }

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