Cod sursa(job #759661)

Utilizator cosmy94Hogas Stefan Cosmin cosmy94 Data 18 iunie 2012 22:43:58
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <fstream>
#define N 510

using namespace std;

ifstream f("plantatie.in");
ofstream g("plantatie.out");

int n,m,A[N][N],i,j,Lg[N],Rmq[11][N][N],k,l;

int Max(int a,int b,int c,int d) {
    a=max(a,b);
    c=max(c,d);
    return max(a,c);
}

int Solve(int x,int y,int L) {
    l=Lg[L];
    return Max(Rmq[l][x][y],Rmq[l][x][y-(1<<l)+L],Rmq[l][x-(1<<l)+L][y],Rmq[l][x-(1<<l)+L][y-(1<<l)+L]);
}

int main() {
    f >> n >> m;
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++) {
            f >> A[i][j];
            Rmq[0][i][j]=A[i][j];
        }
    for (i=2;i<=n;i++) Lg[i]=Lg[i/2]+1;
    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++) {
                l=1<<(k-1);
                Rmq[k][i][j]=Max(Rmq[k-1][i][j],Rmq[k-1][i][j+l],Rmq[k-1][i+l][j],Rmq[k-1][i+l][j+l]);
            }
    for (k=1;k<=m;k++) {
        f >> i >> j >> l;
        g << Solve(i,j,l) << '\n';
    }
    f.close();
    
}