Cod sursa(job #1691148)

Utilizator stoianmihailStoian Mihail stoianmihail Data 16 aprilie 2016 23:49:04
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <stdio.h>
#include <assert.h>

#define treeSize 131072
#define Nadejde 100000

typedef struct {
  int l, r;
  int sum;
} cell;

int N, result;
int val[Nadejde + 1];
cell tree[2 * treeSize];

void update(int u, int left, int right, int a, int b, int add) {
  int mid = (left + right) >> 1;

  if (a <= left && right <= b) {
    tree[u].l += add;
    tree[u].r += add;
    if (left == right) {
      tree[u].sum = tree[u].l;
    } else {
      tree[u].sum = tree[2 * u].sum + (mid - left + 1) * tree[u].l +
                    tree[2 * u + 1].sum + (right - mid) * tree[u].r;
    }
    return;
  }

  if (a <= mid) {
    tree[2 * u].l += tree[u].l;
    tree[2 * u].r += tree[u].l;
    tree[u].l = 0;
    update(2 * u, left, mid, a, b, add);
  }
  if (b > mid) {
    tree[2 * u + 1].l += tree[u].r;
    tree[2 * u + 1].r += tree[u].r;
    tree[u].r = 0;
    update(2 * u + 1, mid + 1, right, a, b, add);
  }
  tree[u].sum = tree[2 * u].sum + (mid - left + 1) * tree[u].l +
                tree[2 * u + 1].sum + (right - mid) * tree[u].r;
}

void query(int u, int left, int right, int a, int b) {
  int mid = (left + right) >> 1;

  if (a <= left && right <= b) {
    if (left == right) {
      tree[u].sum = tree[u].l;
    } else {
      tree[u].sum = tree[2 * u].sum + (mid - left + 1) * tree[u].l +
                    tree[2 * u + 1].sum + (right - mid) * tree[u].r;
    }
    result += tree[u].sum;
    return;
  }

  if (a <= mid) {
    tree[2 * u].l += tree[u].l;
    tree[2 * u].r += tree[u].l;
    tree[u].l = 0;
    query(2 * u, left, mid, a, b);
  }
  if (b > mid) {
    tree[2 * u + 1].l += tree[u].r;
    tree[2 * u + 1].r += tree[u].r;
    tree[u].r = 0;
    query(2 * u + 1, mid + 1, right, a, b);
  }
  tree[u].sum = tree[2 * u].sum + (mid - left + 1) * tree[u].l +
                tree[2 * u + 1].sum + (right - mid) * tree[u].r;
}

/* verificare*/
void afis() {
  for (int i = 1; i <= N; i++) {
    fprintf(stderr, "%d ", i);
  }
  fprintf(stderr, "\n");
  for (int i = 1; i <= N; i++) {
    result = 0;
    query(1, 1, N, i, i);
    assert(val[i] == result);
    fprintf(stderr, "%d ", val[i]);
  }
  fprintf(stderr, "\n");
}
/**/
int main(void) {
  FILE *f = fopen("1.in", "r");
/* Probe.*/
  fscanf(f, "%d", &N);
  int a, b;
  while (fscanf(f, "%d %d", &a, &b) != EOF) {
    fprintf(stderr, "Incrementam [%d, %d]\n", a, b);
    for (int j = a; j <= b; j++) {
      val[j] += 1;
    }
    update(1, 1, N, a, b, +1);
    result = 0;
    query(1, 1, N, 1, N);
    fprintf(stderr,"%d\n", result);
    afis();
  }
/**/
  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}