Cod sursa(job #2772229)

Utilizator RamanujanNeacsu Mihnea Ramanujan Data 31 august 2021 13:16:49
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <bits/stdc++.h>
#define MAXN 502
#define putere 11
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, m, a[MAXN][MAXN][putere], powers[putere], floorExponent[MAXN];
int main()
{
    fin>>n>>m;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            fin>>a[i][j][0];//citim primul nivel
        }
    }
    int index=1;
    powers[0]=1;
    while(powers[index-1]<n){
        powers[index]=powers[index-1]<<1;//puterile lui 2
        index++;
    }
    floorExponent[1]=0;
    int nextPowerOf2=2;
    for(int i=2; i<=n; i++){//precalculam cea mai mare putere de 2 mai mica decat n
         if(i==nextPowerOf2){//la putere de 2
            floorExponent[i]=floorExponent[i-1]+1;
            nextPowerOf2<<=1;//actualizam lucrurile
         }
         else{
            floorExponent[i]=floorExponent[i-1];//sau altfel, pastram asa cum e
         }
    }
    for(int k=1; k<index; k++){//facem pd
       for(int i=0; i<n; i++){//luam nivelul la puricat
          for(int j=0; j<n; j++){
              int startLine=min(i+powers[k-1], n), startCol=min(j+powers[k-1], n);
              a[i][j][k]=max(a[i][j][k-1],
                                 (max(a[startLine][j][k-1],
                                 (max(a[i][startCol][k-1],
                                  a[startLine][startCol][k-1])))));
                                 //maximul din cele 4 subpatrate care acopera totul, cu un noian de suprapuneri
          }
       }
    }
    for(int i=0; i<m; i++){
        int lin, col, lg; fin>>lin>>col>>lg;
        lin--; col--;
        int part=floorExponent[lg];//il definesc ca sa scurtez formula, care e oricum lunga
        fout<<max(a[lin][col][part],max(a[lin+lg-powers[part]][col][part], max(a[lin][col+lg-powers[part]][part], a[lin+lg-powers[part]][col+lg-powers[part]][part])))<<"\n";
    }
    return 0;
}