Cod sursa(job #448141)

Utilizator vladiiIonescu Vlad vladii Data 2 mai 2010 21:03:09
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <iostream>
using namespace std;

int N, M, log[501], rmq[10][501][501];

int maxim(int a, int b, int c, int d) {
    return max(max(a, b), max(c, d));
}

int main() {
    FILE *f1=fopen("plantatie.in", "r"), *f2=fopen("plantatie.out", "w");
    int i, j, k, p, q, c;
    fscanf(f1, "%d %d\n", &N, &M);
    for(i=1; i<=N; i++) {
         for(j=1; j<=N; j++) {
              fscanf(f1, "%d", &rmq[0][i][j]);
         }
    }
    log[1] = 0; log[2] = 1;
    for(i=3; i<=N; i++) {
         log[i] = log[i >> 1] + 1;
    }
    for(p=1; (1 << p)<=N; p++) {
         for(i=1; i<=N; i++) {
              for(j=1; j<=N; j++) {
                   c = 1 << (p-1);
                   rmq[p][i][j] = maxim(rmq[p-1][i][j], rmq[p-1][i + c][j], rmq[p-1][i][j + c], rmq[p-1][i + c][j + c]);
              }
         }
    }
    while(M--) {
         fscanf(f1, "%d %d %d\n", &i, &j, &k);
         p = log[k];
         c = (1 << p);
         int sol = 0;
         sol = maxim(rmq[p][i][j], rmq[p][i + k - c][j], rmq[p][i][j + k - c], rmq[p][i + k - c][j + k - c]);
         fprintf(f2, "%d\n", sol);
    }
    fclose(f1); fclose(f2);
    return 0;
}