Cod sursa(job #2855723)

Utilizator alexdumitruAlexandru Dumitru alexdumitru Data 22 februarie 2022 20:34:46
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <bits/stdc++.h>
#pragma GCC optimize("O2")
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n,i,j,k,q,l;
int rmq[505][505][10],l2[505];
int mymax(int a, int b, int c, int d)
{
    if(a>=b&&a>=c&&a>=d)return a;
    if(b>=a&&b>=c&&b>=d)return b;
    if(c>=a&&c>=b&&c>=d)return c;
    return d;
}
int query(int i, int j, int k)
{
    int l=l2[k];
    return mymax(rmq[i][j][l],rmq[i][j+k-(1<<l)][l],rmq[i+k-(1<<l)][j][l],rmq[i+k-(1<<l)][j+k-(1<<l)][l]);
}
signed main()
{
    fin>>n>>q;
    for(i=2;i<=n;i++)l2[i]=l2[i>>1]+1;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            fin>>rmq[i][j][0];
    for(l=1;l<9;l++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(min(n-i+1,n-j+1)<=(1<<l))
                    rmq[i][j][l]=mymax(rmq[i][j][l-1],rmq[i][j+(1<<(l-1))][l-1],rmq[i+(1<<(l-1))][j][l-1],rmq[i+(1<<(l-1))][j+(1<<(l-1))][l-1]);
    while(q--)
    {
        fin>>i>>j>>k;
        fout<<query(i,j,k)<<'\n';
    }
    return 0;
}