Cod sursa(job #1813093)

Utilizator savulescustefanSavulescu Stefan savulescustefan Data 22 noiembrie 2016 18:14:47
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>

using namespace std;
int i,j,k,n,m,l[504],rmq[504][504][13],Max,x,y;
int main()
{
    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", &rmq[i][j][0]);
    l[1]=0;
    for (i=2;i<=n;i++)
        l[i]=l[i/2]+1;
    for (i=1;(1<<i)<=n;i++)
        for (j=1;j<=(n-(1<<i)+1);j++)
        for (k=1;k<=(n-(1<<i)+1);k++)
        {
            Max=0;
            if (rmq[j+(1<<(i-1))][k][i-1]>rmq[j][k][i-1])
                Max=rmq[j+(1<<(i-1))][k][i-1];
            else
                Max=rmq[j][k][i-1];
            if (rmq[j][k+(1<<(i-1))][i-1]>Max)
                Max=rmq[j][k+(1<<(i-1))][i-1];
            if (rmq[j+(1<<(i-1))][k+(1<<(i-1))][i-1]>Max)
                Max=rmq[j+(1<<(i-1))][k+(1<<(i-1))][i-1];
            rmq[j][k][i]=Max;
        }
    for (i=1;i<=m;i++)
    {
        scanf ("%d %d %d", &x, &y, &k);
        Max=0;
        if (rmq[x][y][l[k]]>rmq[x+k-(1<<l[k])][y+k-(1<<l[k])][l[k]])
            Max=rmq[x][y][l[k]];
        else
            Max=rmq[x+k-(1<<l[k])][y+k-(1<<l[k])][l[k]];
        if (Max<rmq[x][y+k-(1<<l[k])][l[k]])
            Max=rmq[x][y+k-(1<<l[k])][l[k]];
        if (Max<rmq[x+k-(1<<l[k])][y][l[k]])
            Max=rmq[x+k-(1<<l[k])][y][l[k]];
        printf ("%d\n", Max);
    }
    return 0;
}