Cod sursa(job #1813022)

Utilizator savulescustefanSavulescu Stefan savulescustefan Data 22 noiembrie 2016 17:25:06
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 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][1]);
    for (i=1;i<=n;i++)
        l[i]=l[i/2]+1;
    for (i=2;(1<<(i-1))<=n;i++)
        for (j=1;j<=(n-(1<<(i-1))+1);j++)
        for (k=1;k<=(n-(1<<(i-1))+1);k++)
        {
            Max=0;
            if (rmq[j+(1<<(i-2))][k][i-1]>rmq[j][k][i-1])
                Max=rmq[j+(1<<(i-2))][k][i-1];
            else
                Max=rmq[j][k][i-1];
            if (rmq[j][k+(1<<(i-2))][i-1]>Max)
                Max=rmq[j][k+(1<<(i-2))][i-1];
            if (rmq[j+(1<<(i-2))][k+(1<<(i-2))][i-1]>Max)
                Max=rmq[j+(1<<(i-2))][k+(1<<(i-2))][i-1];
            rmq[j][k][i]=Max;
        }
    for (i=1;i<=m;i++)
    {
        scanf ("%d %d %d", &x, &y, &k);
        if (rmq[x][y][l[k]]>rmq[x+k-(1<<(l[k]-1))][y+k-(1<<(l[k]-1))][l[k]])
            printf ("%d\n", rmq[x][y][l[k]]);
        else
            printf ("%d\n", rmq[x+k-(1<<(l[k]-1))][y+k-(1<<(l[k]-1))][l[k]]);
    }
    return 0;
}