Cod sursa(job #191706)

Utilizator cata00Catalin Francu cata00 Data 28 mai 2008 00:14:55
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <math.h>
#include <stdio.h>

// Store sqrt(n) buckets of size sqrt(n). Then we can answer queries in time
// sqrt(n).

int n, m, rad;
int a[17000], bucket[130];
FILE *fin, *fout;

void preprocess() {
  for (int i = 0; i < rad; i++) {
    bucket[i] = 0;
  }
  for (int i = 0; i < n; i++) {
    bucket[i / rad] += a[i];
  }
}

void query(int lo, int hi) {
  int result = 0;
  int bLo = lo / rad;
  int endLo = (bLo + 1) * rad;
  int bHi = hi / rad;
  int startHi = bHi * rad;

  if (bLo == bHi) {
    for (int i = lo; i < hi; i++) {
      result += a[i];
    }
  } else {
    for (int b = bLo + 1; b < bHi; b++) {
      result += bucket[b];
    }
    for (int i = lo; i < endLo; i++) {
      result += a[i];
    }
    for (int i = startHi; i < hi; i++) {
      result += a[i];
    }
  }
  fprintf(fout, "%d\n", result);
}

void update(int day, int value) {
  a[day] -= value;
  bucket[day / rad] -= value;
}

int main(void) {
  fin = fopen("datorii.in", "rt");
  fout = fopen("datorii.out", "wt");
  fscanf(fin, "%d %d", &n, &m);
  rad = (int)sqrt(n - 1) + 1;
  for (int i = 0; i < n; i++) {
    fscanf(fin, "%d", &a[i]);
  }

  preprocess();

  for (int testNum = 0; testNum < m; testNum++) {
    int testType, v1, v2;
    fscanf(fin, "%d %d %d", &testType, &v1, &v2);
    if (testType) {
      query(v1 - 1, v2);
    } else {
      update(v1 - 1, v2);
    }
  }


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