Cod sursa(job #2485189)

Utilizator AlexandruPaulSirbu Alex AlexandruPaul Data 1 noiembrie 2019 09:41:10
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<fstream>
#define max4(a,b,c,d) max(max(a,b),max(c,d))

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

const int NMaxx=5e2+1;
const int PMaxx=18;
int sparseTable[NMaxx][NMaxx][PMaxx];
int log[NMaxx];

void build_sparseTable(int n){
    int i,j,k;
    for (k=1; (1<<k)<=n; ++k){
        for (i=1; i+(1<<k)-1<=n; ++i){
            for (j=1; j+(1<<k)-1<=n; ++j){
                sparseTable[i][j][k]=max4(sparseTable[i][j][k-1],sparseTable[i][j+(1<<(k-1))][k-1],sparseTable[i+(1<<(k-1))][j][k-1],sparseTable[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);
            }
        }
    }
}
int query(int x,int y,int k){
    int p=log[k];
    return max4(sparseTable[x][y][p],sparseTable[x+k-(1<<p)][y][p],sparseTable[x][y+k-(1<<p)][p],sparseTable[x+k-(1<<p)][y+k-(1<<p)][p]);
}

int main() {
    int n,q,i,j,x,y,k;
    fin>>n>>q;
    log[1]=0;
    for (i=2; i<=n; ++i){
        log[i]=1+log[i/2];
    }
    for (i=1; i<=n; ++i){
        for (j=1; j<=n; ++j){
            fin>>sparseTable[i][j][0];
        }
    }
    build_sparseTable(n);
    for(;q;--q){
        fin>>x>>y>>k;
        fout<<query(x,y,k)<<"\n";
    }
    return 0;
}