Cod sursa(job #2402660)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 10 aprilie 2019 21:39:48
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>
#define Dim 504
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
int N,Q,rmq[10][Dim][10][Dim],x;
int a,b,c,d,r1,r2,r3,r4,q1,q2,lat;

int main()
{
    f>>N>>Q;
    for(int i=1;i<=N;i++)
    for(int j=1;j<=N;j++)
    {
        f>>x;
        rmq[0][i][0][j]=x;
    }

    for(int i=1;i<=N;i++)
    for(int k=1;(1<<k)<=N;k++)
    for(int j=1;j+(1<<k)-1<=N;j++)
    rmq[0][i][k][j]=max(rmq[0][i][k-1][j],rmq[0][i][k-1][j+(1<<(k-1))]);

    for(int l=1;(1<<l)<=N;l++)
    for(int i=1;i+(1<<l)-1<=N;i++)
    for(int k=1;(1<<k)<=N;k++)
    for(int j=1;j+(1<<k)-1<=N;j++)
    {
        rmq[l][i][k][j]=max(rmq[l-1][i][k-1][j],rmq[l-1][i][k-1][j+(1<<(k-1))]);
        int ras=max(rmq[l-1][i+(1<<(l-1))][k-1][j],rmq[l-1][i+(1<<(l-1))][k-1][j+(1<<(k-1))]);
        rmq[l][i][k][j]=max(ras,rmq[l][i][k][j]);
    }

    for(int i=1;i<=Q;i++)
    {
        f>>a>>b>>lat;
        c=a+lat-1;
        d=b+lat-1;
        if(a>c) swap(a,c);
        if(b>d) swap(b,d);
        int difa=log2(c-a+1);
        int difb=log2(d-b+1);
        r1=rmq[difa][a][difb][b];
        r2=rmq[difa][a][difb][d-(1<<difb)+1];
        r3=rmq[difa][c-(1<<difa)+1][difb][b];
        r4=rmq[difa][c-(1<<difa)+1][difb][d-(1<<difb)+1];
        q1=max(r1,r2);
        q2=max(r3,r4);
        g<<max(q1,q2)<<'\n';
    }
    return 0;
}