Cod sursa(job #3134545)

Utilizator IanisBelu Ianis Ianis Data 29 mai 2023 13:03:19
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#define debug(x) cerr << #x << " = " << x << endl
#else
#define debug(x)
#endif

#define endl '\n'

#define sz(a) ((int)(a).size())
#define all(a) (a).begin(), (a).end()
#define erase_unique(a) sort(all(a)); (a).erase(unique(all(a)), (a).end())

#define fi first
#define se second

#define YES cout << "YES" << endl
#define NO cout << "NO" << endl

#define lsb(x) (x & (-x))

#define FILE_NAME "plantatie"

typedef long long ll;
typedef pair<int, int> pii;

const int NMAX = 505;
const int LOGN = 10;

int n, m;
int a[NMAX][NMAX];
int rmq[NMAX][NMAX][LOGN];
int lg2[NMAX];

void rmq_build(int rmq[NMAX][LOGN], int a[NMAX]) {
	for (int i = 1; i <= n; i++) {
		rmq[i][0] = a[i];
	}
	for (int j = 1; 1 << j <= n; j++) {
		for (int i = 1; i + (1 << j) - 1 <= n; i++) {
			rmq[i][j] = max(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
		}
	}
}

void precalc() {
	for (int i = 1; i <= n; i++) {
		if (i != 1) lg2[i] = lg2[i >> 1] + 1;
		rmq_build(rmq[i], a[i]);
	}
}

int rmq_query(int rmq[NMAX][LOGN], int l, int r) {
	int k = lg2[r - l + 1];
	return max(rmq[l][k], rmq[r - (1 << k) + 1][k]);
}

int query(int i1, int j1, int i2, int j2) {
	int ans = 0;
	for (int i = i1; i <= i2; i++) {
		ans = max(ans, rmq_query(rmq[i], j1, j2));
	}
	return ans;
}

signed main() {
#ifdef LOCAL
	freopen("input.txt", "r", stdin);
#else
	freopen(FILE_NAME ".in", "r", stdin);
	freopen(FILE_NAME ".out", "w", stdout);
#endif

	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			cin >> a[i][j];

	precalc();

	int x, y, l;
	while (m--) {
		cin >> x >> y >> l;
		cout << query(x, y, x + l - 1, y + l - 1) << endl;
	}

	return 0;
}