Cod sursa(job #3369438)

Utilizator Alias47John Doe Alias47 Data 20 octombrie 2026 12:08:51
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vc;
typedef vector<vector<int>> matrix;
#define ft(n) for(ull i=1; i<=n; i++)
#define sp ' '
string file = "plantatie";
ifstream f(file + ".in");
ofstream g(file + ".out");

int n, m, logn;
vector<matrix> dp;

void test()
{
    for (int k = 0; k <= logn; k++)
    {
        g << k << endl;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
                g << dp[k][i][j] << sp;
            g << endl;
        }
        g << endl;
    }
    g << endl << endl;
}

void precalc()
{
    logn = log2(n);
    dp.resize(logn + 1, matrix(n + 5, vc(n + 5, 0)));
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            f >> dp[0][i][j]; //2^0 side len

    for (int k = 1; k <= logn; k++) //2^k side len
        for (int i = 1; i <= n - (1 << k) + 1; i++)
            for (int j = 1; j <= n - (1 << k) + 1; j++)
            {
                int slen = (1 << (k - 1)); //len of the smaller squares' sides
                int first2squares = max(dp[k - 1][i][j], dp[k - 1][i][j + slen]);
                int last2squares = max(dp[k - 1][i + slen][j], dp[k - 1][i + slen][j + slen]);
                dp[k][i][j] = max(first2squares, last2squares);

            }
    //test();
}

void rmq()
{
    int x, y, len; //corner 1 (x, y)
    f >> x >> y >> len;
    int smk = log2(len); //smaller k
    int smlen = 1 << smk; //4 overlapping or touching squares of 2^log2 length
    int first2squares = max(dp[smk][x][y], dp[smk][x][y + len - smlen]); //technically x+(len-1)-smlen+1
    int last2squares = max(dp[smk][x + len - smlen][y], dp[smk][x + len - smlen][y + len - smlen]);
    int res = max(first2squares, last2squares);
    g << res << "\n";
}

int main()
{
    f >> n >> m;
    precalc();
    for (int i = 1; i <= m; i++)
        rmq();
    return 0;
}