Cod sursa(job #1977912)

Utilizator rusuraresRares Rusu rusurares Data 6 mai 2017 13:54:06
Problema Plantatie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>
#include <stdlib.h>

int log[501], r[501][501][10];

int max(int a, int b){
    if(a>b)
        return a;
    return b;
}

int query(int i, int j, int x){
    int l=log[x], i2=i+x-1, j2=j+x-1;
    return max(max(r[i2][j2][l], r[i+(1<<l)-1][j2][l]), max(r[i2][j+(1<<l)-1][l], r[i+(1<<l)-1][j+(1<<l)-1][l]));
}

int main()
{
    int n, m, k, i, j, x, y;
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);

    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            scanf("%d", &r[i][j][0]);

    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            for(k=1;(1<<k)<=i && (1<<k)<=j;k++)
                r[i][j][k]=max(max(r[i][j][k-1], r[i-(1<<(k-1))][j][k-1]), max(r[i][j-(1<<(k-1))][k-1], r[i-(1<<(k-1))][j-(1<<(k-1))][k-1]));
    log[1]=0;
    for(i=2;i<=500;i++)
        log[i]=1+log[i/2];
    for(i=0;i<m;i++){
        scanf("%d%d%d", &x, &y, &k);
        printf("%d\n", query(x, y, k));
    }
    return 0;
}