Cod sursa(job #2816383)

Utilizator Teodor94Teodor Plop Teodor94 Data 11 decembrie 2021 12:27:35
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
// Batog

#include <stdio.h>
#include <math.h>

#define MAX_N 15000
const int SQ_N = sqrt(MAX_N);
const int BATOG_SIZE = (MAX_N + SQ_N - 1) / SQ_N;

#define UPDATE 0
#define QUERY 1

int v[MAX_N];
int batog[BATOG_SIZE];

void build(int n) {
  int i;

  for (i = 0; i < n; ++i)
    batog[i / SQ_N] += v[i];
}

inline void update(int pos, int decrease) {
  batog[pos / SQ_N] -= decrease;
  v[pos] -= decrease;
}

int query(int left, int right) {
  int firstInterval, lastInterval, result;

  firstInterval = (left + SQ_N - 1) / SQ_N * SQ_N;
  lastInterval = right / SQ_N * SQ_N;

  result = 0;
  while (left <= right && left < firstInterval)
    result += v[left++];
  while (right >= left && right >= lastInterval)
    result += v[right--];

  firstInterval /= SQ_N;
  lastInterval /= SQ_N;

  while (firstInterval < lastInterval)
    result += batog[firstInterval++];

  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(n);

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

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

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