Cod sursa(job #1486369)

Utilizator dnprxDan Pracsiu dnprx Data 14 septembrie 2015 19:00:36
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

int p2[505], a[505][505], rmq[10][505][505], n;
/// rmq[i,j,k]=maximul pe patratul avand coltul stanga-sus in (j,k)
///   si latura de lungime 2^i

/// p2[i] = k : 2^k <= i si k e maxim
void Puteri2()
{
    int i;
    p2[1] = 0;
    for (i = 2; i <= 500; i++)
        p2[i] = 1 + p2[i / 2];
}

inline int Max(int x, int y, int z, int w)
{
    return max(max(x, y), max(z, w));
}

void RMQ()
{
    int i, j, k, L, len;
    for (k = 1; k <= p2[n]; k++)
    {
        L = (1 << k);
        len = 1 << (k - 1);
        for (i = 1; i <= n - L + 1; i++)
            for (j = 1; j <= n - L + 1; j++)
                rmq[k][i][j] = Max(rmq[k-1][i][j],rmq[k-1][i+len][j],
                        rmq[k-1][i][j+len],rmq[k-1][i+len][j+len]);
    }
}

void CitireAfisare()
{
    int i, j, Q, k, q, sol, L, len;
    ifstream fin("plantatie.in");
    ofstream fout("plantatie.out");
    fin >> n >> Q;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            fin >> rmq[0][i][j];
    RMQ();
    for (q = 1; q <= Q; q++)
    {
        fin >> i >> j >> k;
        len = p2[k]; L = 1 << len;
        sol = Max(rmq[len][i][j],rmq[len][i+k-L][j+k-L],
                  rmq[len][i+k-L][j],rmq[len][i][j+k-L]);
        fout << sol << "\n";
    }
    fin.close();
    fout.close();
}

int main()
{
    Puteri2();
    CitireAfisare();
    return 0;
}