Cod sursa(job #1673468)

Utilizator stoianmihailStoian Mihail stoianmihail Data 3 aprilie 2016 20:34:44
Problema Plantatie Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <stdio.h>
#include <stdlib.h>

#define Smerenie 75000
#define Nadejde 500

typedef struct {
  int l, c, k;
  int init;
} cell;

int N;
int val[Nadejde + 1][Nadejde + 1];
int top[Nadejde + 1][Nadejde + 1];

int front, back;
int deq[Nadejde + 1];

int M, ptr = 1;
cell query[Smerenie + 1];
int answer[Smerenie + 1];

int MAX(int X, int Y) {
  return X > Y ? X : Y;
}

int cmp(cell X, cell Y) {
  return ((X.k < Y.k) || ((X.k == Y.k) && ((X.c < Y.c) || ((X.c == Y.c) && (X.l < Y.l)))));
}

void sort(int begin, int end) {
  int b = begin, e = end;
  cell tmp, pivot = query[(b + e) >> 1];

  while (b <= e) {
    while (cmp(query[b], pivot)) {
      b++;
    }
    while (cmp(pivot, query[e])) {
      e--;
    }
    if (b <= e) {
      tmp = query[b];
      query[b++] = query[e];
      query[e--] = tmp;
    }
  }
  if (begin < e) {
    sort(begin, e);
  }
  if (b < end) {
    sort(b, end);
  }
}

void init() {
  front = 1;
  back = 0;
}

void iterator(int l, int c, int result) {
  if ((l == query[ptr].l) && (c == query[ptr].c)) {
    answer[query[ptr].init] = result;
    ptr++;
  }
}

/*
void afis(int len) {
  int i, j;

  fprintf(stderr, "La %d\n", len);
  for (i = 1; i <= N; i++) {
    for (j = 1; j <= N; j++) {
      fprintf(stderr, "%d ", top[i][j]);
    }
    fprintf(stderr, "\n");
  }
  fprintf(stderr, "STOP\n");
}
*/

void check(int len) {
  int i, j;

  for (i = 1; i <= N; i++) {
    init();
    for (j = 1; j <= N; j++) {
      while ((front <= back) && (val[i][j] >= val[i][deq[back]])) {
        back--;
      }
      back++;
      deq[back] = j;

      if (deq[front] == j - len) {
        front++;
      }
      if (j >= len) {
        top[i][j] = val[i][deq[front]];
      }
    }
  }

  //afis(len);

  for (j = len; j <= N; j++) {
    init();
    for (i = 1; i <= N; i++) {
      while ((front <= back) && (top[i][j] >= top[deq[back]][j])) {
        back--;
      }
      back++;
      deq[back] = i;

      if (deq[front] == i - len) {
        front++;
      }
      if (i >= len) {
        iterator(i - len + 1, j - len + 1, top[deq[front]][j]);
      }
    }
  }
}

int main(void) {
  int i, j;
  FILE *f = fopen("plantatie.in", "r");

  fscanf(f, "%d %d", &N, &M);
  for (i = 1; i <= N; i++) {
    for (j = 1; j <= N; j++) {
      fscanf(f, "%d", &val[i][j]);
    }
  }

  for (i = 1; i <= M; i++) {
    fscanf(f, "%d %d %d", &query[i].l, &query[i].c, &query[i].k);
    query[i].init = i;
  }
  fclose(f);

  sort(1, M);

  while (ptr <= M) {
    check(query[ptr].k);
  }

  freopen("plantatie.out", "w", stdout);
  for (i = 1; i <= M; i++) {
    fprintf(stdout, "%d\n", answer[i]);
  }
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}