Cod sursa(job #2816622)

Utilizator Alex_HossuHossu Alexandru Alex_Hossu Data 11 decembrie 2021 19:41:11
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>

const int MAXN = 1e5;

int v[MAXN + 1];
int aint[2 * MAXN + 1];

void build(int left, int right, int node) {
  int mid, leftSon, rightSon;
  if (left == right) {
    aint[node] = v[left];
    return;
  }
  mid = (left + right) / 2;
  leftSon = node + 1;
  rightSon = node + 2 * (mid - left + 1);
  build(left, mid, leftSon);
  build(mid + 1, right, rightSon);
  aint[node] = aint[leftSon] + aint[rightSon];
}

void update(int left, int right, int node, int x, int val) {
  int mid;
  if (left == right) {
    aint[node] -= val;
    return;
  }
  mid = (left + right) / 2;
  if (x <= mid)
    update(left, mid, node + 1, x, val);
  else
    update(mid + 1, right, node + 2 * (mid - left + 1), x, val);
  aint[node] = aint[node + 1] + aint[node + 2 * (mid - left + 1)];
}

int query(int left, int right, int node, int qleft, int qright) {
  int mid;
  if (qright < left || qleft > right) {
    return 0;
  }
  if (left >= qleft && right <= qright) {
    return aint[node];
  }
  mid = (left + right) / 2;
  int s1 = 0, s2 = 0;
  if (qleft <= mid)
    s1 = query(left, mid, node + 1, qleft, qright);
  if(mid < qright)
    s2 = query(mid + 1, right, node + 2 * (mid - left + 1), qleft, qright);
  return s1 + s2;
}

int main() {
  FILE *fin, *fout;
  int n, m, op, a, b, i;

  fin = fopen( "datorii.in", "r" );
  fout = fopen( "datorii.out", "w" );
  fscanf( fin, "%d%d", &n, &m );

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

  for (i = 0; i < m; i++) {
    fscanf(fin, "%d%d%d", &op, &a, &b);
    if (op == 1)
      fprintf(fout, "%d\n", query(1, n, 1, a, b));
    else
      update(1, n, 1, a, b);
  }
  fclose(fin);
  fclose(fout);

  return 0;
}