Cod sursa(job #2397537)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 4 aprilie 2019 15:42:41
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
const int N = 509;
int a[N][N], rmq[N][N][20];
int n,k;
void Rmq()
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            rmq[i][j][0]=a[i][j];
    for(int k=1; k<=log2(n)+1; k++)
        for(int i=1; i<=n&&i+(1<<k)<=n+1; i++)
            for(int j=1; j<=n&&j+(1<<k)<=n+1; j++)
            {
                rmq[i][j][k]=rmq[i][j][k-1];
                rmq[i][j][k]=max(rmq[i][j][k],rmq[i+(1<<(k-1))][j][k-1]);
                rmq[i][j][k]=max(rmq[i][j][k],rmq[i][j+(1<<(k-1))][k-1]);
                rmq[i][j][k]=max(rmq[i][j][k],rmq[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
            }
}
void solve()
{
    Rmq();
    while(k)
    {
        int x,y,K;
        k--;
        fin>>x>>y>>K;
        int put=log2(K);
        int ans=max(rmq[x][y][put],rmq[x+K-(1<<put)][y][put]);
        ans=max(ans,rmq[x][y+K-(1<<put)][put]);
        ans=max(ans,rmq[x+K-(1<<put)][y+K-(1<<put)][put]);
        fout<<ans<<'\n';
    }
}
int main()
{
    fin>>n>>k;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            fin>>a[i][j];
    solve();
    return 0;
}