Pagini recente » Cod sursa (job #538938) | Cod sursa (job #2967891) | Cod sursa (job #2116340) | Cod sursa (job #887935) | Cod sursa (job #1673468)
#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;
}