Cod sursa(job #2987941)

Utilizator mati.coldea@gmail.comMatei Coldea [email protected] Data 3 martie 2023 10:16:49
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int r[20][505][505];
int a[505][505];
int E[505];

int n, m;

void precalc() {

    E[1] = 0;
    for (int i = 2; i <= n; i++) {
        E[i] = 1 + E[i / 2];
    }
}



int main()
{
   
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            fin >> a[i][j];
            r[0][i][j] = a[i][j];
        }
    }
    precalc();

    for (int p = 1; (1 << p) <= n; p++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                r[p][i][j] = r[p - 1][i][j];
                int xi = i + (1 << (p - 1));
                int xj = j + (1 << (p - 1));
                if (xi <= n) {
                    r[p][i][j] = max(r[p][i][j], r[p - 1][xi][j]);
                }
                
                if (xj <= n) {
                    r[p][i][j] = max(r[p][i][j], r[p - 1][i][xj]);
                }

                if (xi <= n && xj <= n) {
                    r[p][i][j] = max(r[p][i][j], r[p - 1][xi][xj]);

                }

            }
        }
    }

    int st, dr, k;
    for (int i = 1; i <= m; i++) {
        fin >>st >> dr >> k;

        int e = E[k];
        int stnou = st + k - (1 << e);
        int drnou = dr + k - (1 << e);
        

        int term1= max(r[e][st][dr], r[e][st][drnou]);
        int term2 = max(r[e][stnou][drnou], r[e][stnou][drnou]);
        cout << max(term1, term2)<<'\n';

    }




    fin.close();
    fout.close();

}