Cod sursa(job #2798705)

Utilizator Cezar211Popoveniuc Cezar Cezar211 Data 11 noiembrie 2021 19:19:02
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

#define min max
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

void read();

void build_table();

void solve();

int n, m, v[505][505][15];

int log(int x) {
    for (int i = 31; i >= 0; i--)
        if (x & (1 << i))
            return i;
    return 0;
}
int lg[505];
int main() {
    read();
    build_table();
    solve();
    return 0;
}

void solve() {
    for(int i=1; i<=500; i++)
        lg[i] = log(i);
    for (int q = 1; q <= m; q++) {
        int x, y, l;
        fin >> x >> y >> l;
        int k = lg[l];
        int new_x = x + l - (1 << k), new_y = y + l - (1 << k);
        fout << min(min(v[x][y][k], v[new_x][y][k]), min(v[new_x][new_y][k], v[x][new_y][k]));
        fout << '\n';
    }
}

void build_table() {
    for (int k = 1; (1 << k) <= n; k++)
        for (int i = 1; i <= n - (1 << k) + 1; i++)
            for (int j = 1; j <= n - (1 << k) + 1; j++)
                v[i][j][k] = min(min(v[i][j][k - 1], v[i + (1 << (k - 1))][j][k - 1]),
                                 min(v[i][j + (1 << (k - 1))][k - 1],
                                     v[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]));
}

void read() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            fin >> v[i][j][0];
}