Cod sursa(job #2566607)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 2 martie 2020 22:15:24
Problema Plantatie Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <bits/stdc++.h>
#define NMAX 505
#define LOGMAX 20
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int a[NMAX][NMAX];
struct tip{int x;int y;};
tip sol[NMAX][NMAX][LOGMAX];
int n,m;
int i,j;
void prel();
int main()
{fin>>n>>m;
 for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
     fin>>a[i][j];
 prel();
 for(i=1;i<=m;i++)
    {
     int vx,vy,r;
     fin>>vx>>vy>>r;
     int lvx,lvy;
     lvx=vx+r-1;
     lvy=vy+r-1;
      int lg= log2(r);
     fout<< max (max(  a[sol[vx][vy][lg].x][sol[vx][vy][lg].y ], a[sol[ lvx -  (1<<lg)+1 ][vy][lg].x][sol[lvx- (1<<lg)+1][vy][lg].y ]        )  , max(  a [sol[vx][lvy- (1<<lg)+1 ][lg].x][sol[vx][lvy- (1<<lg)+1 ][lg].y] ,a [sol[lvx- (1<<lg)+1][lvy- (1<<lg)+1 ][lg].x][sol[lvx- (1<<lg)+1][lvy- (1<<lg)+1 ][lg].y]   ))<<'\n';
    }
    return 0;
}
void prel()
{
 int i,j;
 for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
        sol[i][j][0]={i,j};
  for(int lg=1; (1<<lg)<=n;lg++)
    for(i=1;i + (1<<lg)-1<=n;i++)
        for(j=1;j+(1<<lg)-1<=n;j++)
            {
             if(  a[sol[i][j][lg-1].x][sol[i][j][lg-1].y] > a[sol[i+ (1<<(lg-1))][j][lg-1].x][sol[i+ (1<<(lg-1))][j][lg-1].y]   && /**/a[sol[i][j][lg-1].x][sol[i][j][lg-1].y] > a[sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].x][sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].y]  && a[sol[i][j][lg-1].x][sol[i][j][lg-1].y] > a[sol[i][j+ (1<<(lg-1))][lg-1].x][sol[i][j+ (1<<(lg-1))][lg-1].y])
                sol[i][j][lg]=sol[i][j][lg-1];
             if(  a[sol[i][j][lg-1].x][sol[i][j][lg-1].y] < a[sol[i+ (1<<(lg-1))][j][lg-1].x][sol[i+ (1<<(lg-1))][j][lg-1].y]   && /**/a[sol[i+ (1<<(lg-1))][j][lg-1].x][sol[i+ (1<<(lg-1))][j][lg-1].y] > a[sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].x][sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].y]  && a[sol[i+ (1<<(lg-1))][j][lg-1].x][sol[i+ (1<<(lg-1))][j][lg-1].y] > a[sol[i][j+ (1<<(lg-1))][lg-1].x][sol[i][j+ (1<<(lg-1))][lg-1].y])
                sol[i][j][lg]=sol[i+ (1<<(lg-1))][j][lg-1];
             if(  a[sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].x][sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].y] > a[sol[i+ (1<<(lg-1))][j][lg-1].x][sol[i+ (1<<(lg-1))][j][lg-1].y]   && /**/a[sol[i][j][lg-1].x][sol[i][j][lg-1].y] < a[sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].x][sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].y]  && a[sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].x][sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].y] > a[sol[i][j+ (1<<(lg-1))][lg-1].x][sol[i][j+ (1<<(lg-1))][lg-1].y])
                sol[i][j][lg]=sol[i+ (1<<(lg-1))][j+(1<<(lg-1))][lg-1];


             if(  a[sol[i][j+ (1<<(lg-1))][lg-1].x][sol[i][j+ (1<<(lg-1))][lg-1].y] > a[sol[i+ (1<<(lg-1))][j][lg-1].x][sol[i+ (1<<(lg-1))][j][lg-1].y]   && /**/a[sol[i][j+ (1<<(lg-1))][lg-1].x][sol[i][j+ (1<<(lg-1))][lg-1].y] > a[sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].x][sol[i+ (1<<(lg-1))][j+ (1<<(lg-1))][lg-1].y]  && a[sol[i][j][lg-1].x][sol[i][j][lg-1].y] < a[sol[i][j+ (1<<(lg-1))][lg-1].x][sol[i][j+ (1<<(lg-1))][lg-1].y])
                sol[i][j][lg]=sol[i][j+ (1<<(lg-1))][lg-1];

            }
}