Cod sursa(job #2120434)

Utilizator valorosu_300Cristian Gherman valorosu_300 Data 2 februarie 2018 14:31:03
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>
using namespace std;
ifstream in("plantatie.in");
ofstream out("plantatie.out");
const int N = 502, L = 10;
int rmq[N][N][L], put[L], lg[N], n, x, y, k;
void process(){
    lg[1] = 0;
    for(int i=2;i<=n;i++)
        lg[i] = lg[i/2] + 1;
    put[0] = 1;
    for(int i=1;i<=L;i++)
        put[i] = put[i-1] * 2;
    for(int k=1;put[k]<=n;k++)
        for(int i=1;i<=n-put[k]+1;i++)
            for(int j=1;j<=n-put[k]+1;j++)
                rmq[i][j][k] = max(max(rmq[i][j][k-1],rmq[i+put[k-1]][j][k-1]),
                                   max(rmq[i][j+put[k-1]][k-1],rmq[i+put[k-1]][j+put[k-1]][k-1]));
}
int query(){
    int l = lg[k], dist;
    dist = k - put[l];
    return max(max(rmq[x][y][l], rmq[x+dist][y][l]),
               max(rmq[x][y+dist][l], rmq[x+dist][y+dist][l]));
}
int main()
{
    int m;
    in>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            in>>rmq[i][j][0];
    process();
    for(int i=1;i<=m;i++){
        in>>x>>y>>k;
        out<<query()<<"\n";
    }
    in.close();
    out.close();
    return 0;
}