Cod sursa(job #837795)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 18 decembrie 2012 18:13:45
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<cstdio>
#include<algorithm>

using namespace std;

#define Lmax 10
#define Nmax 512

int rmq[Lmax][Nmax][Nmax], log[Nmax], N, M;

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

int main() {

    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);

    int a, b, c, d, i, j, k, poz, rez;

    scanf("%d %d",&N,&M);
    for(i=1; i<=N; ++i)
        for(j=1; j<=N; ++j)
            scanf("%d",&rmq[0][i][j]);

    for(i=2; i<=N; ++i)
        log[i] = log[i/2]+1;

    for(k=1; (1<<k)<=N; ++k)
        for(i=1; i+(1<<k)-1<=N; ++i)
            for(j=1; j+(1<<k)-1<=N; ++j) {
                a = rmq[k-1][i][j];
                b = rmq[k-1][i+(1<<(k-1))][j];
                c = rmq[k-1][i][j+(1<<(k-1))];
                d = rmq[k-1][i+(1<<(k-1))][j+(1<<(k-1))];
                rmq[k][i][j] = maxim(a, b, c, d);
            }

    while(M--) {
        scanf("%d %d %d",&i,&j,&k);
        poz = log[k];
        a = rmq[poz][i][j];
        b = rmq[poz][i-(1<<poz)+k][j];
        c = rmq[poz][i][j-(1<<poz)+k];
        d = rmq[poz][i-(1<<poz)+k][j-(1<<poz)+k];
        rez = maxim(a, b, c, d);
        printf("%d\n",rez);
    }

    return 0;
}