Cod sursa(job #2503076)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 2 decembrie 2019 12:20:51
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <iostream>
using namespace std;
long long n,m,i,j,k,p,put,pu[505],rmq[505][505][12];
int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(i=2; i<=n; i*=2) pu[i]++;
    for(i=1; i<=n; i++) pu[i]+=pu[i-1];
    for(i=1; i<=n; i++)
    for(j=1; j<=n; j++)
    scanf("%lld",&rmq[i][j][0]);
    for(p=2; p<=n; p*=2)
    for(i=1; i<=n-p+1; i++)
    for(j=1; j<=n-p+1; j++)
    {
        long long a,b;
        a=max(rmq[i][j][pu[p]-1],rmq[i][j+p/2][pu[p]-1]);
        b=max(rmq[i+p/2][j][pu[p]-1],rmq[i+p/2][j+p/2][pu[p]-1]);
        rmq[i][j][pu[p]]=max(a,b);
    }
    /*for(p=1; p<=n; p*=2)
    {
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
                g<<rmq[i][j][pu[p]]<<" ";
            g<<'\n';
        }
        g<<'\n';
    }*/
    while(m)
    {
        m--;
        scanf("%lld%lld%lld",&i,&j,&k);
        p=pu[k];
        put=p;
        p=1<<put;
        long long a,b;
        a=max(rmq[i][j][put],rmq[i+k-p][j][put]);
        b=max(rmq[i][j+k-p][put],rmq[i+k-p][j+k-p][put]);
        printf("%lld\n",max(a,b));
    }
    return 0;
}