悬关,分块裸题
查看原帖
悬关,分块裸题
429491
xin20110426楼主2024/8/12 11:21
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 1e18 + 5;
int n, m, q, a[100010], b[100010], st1[100010][70], st2[100010][70], st3[100010][70], st4[100010][70], st5[100010][70], st6[100010][70]; 
void build1() {
	for (int i = 1; i <= n; i++) st1[i][0] = a[i];
	for (int j = 1; (1 << j) <= n; j++) 
		for (int i = 1; i + (1 << j) - 1 <= n; i++)
			st1[i][j] = max(st1[i][j - 1], st1[i + (1 << j - 1)][j - 1]);
}
void build2() {
	for (int i = 1; i <= m; i++) st2[i][0] = b[i];
	for (int j = 1; (1 << j) <= m; j++) 
		for (int i = 1; i + (1 << j) - 1 <= m; i++)
			st2[i][j] = max(st2[i][j - 1], st2[i + (1 << j - 1)][j - 1]);
}
void build3() {
	for (int i = 1; i <= n; i++) st3[i][0] = a[i];
	for (int j = 1; (1 << j) <= n; j++) 
		for (int i = 1; i + (1 << j) - 1 <= n; i++)
			st3[i][j] = min(st3[i][j - 1], st3[i + (1 << j - 1)][j - 1]);
}
void build4() {
	for (int i = 1; i <= m; i++) st4[i][0] = b[i];
	for (int j = 1; (1 << j) <= m; j++) 
		for (int i = 1; i + (1 << j) - 1 <= m; i++)
			st4[i][j] = min(st4[i][j - 1], st4[i + (1 << j - 1)][j - 1]);
}
void build5() {
	for (int i = 1; i <= n; i++) if (a[i] >= 0) st5[i][0] = a[i]; else st5[i][0] = INF;
	for (int j = 1; (1 << j) <= n; j++) 
		for (int i = 1; i + (1 << j) - 1 <= n; i++)
			st5[i][j] = min(st5[i][j - 1], st5[i + (1 << j - 1)][j - 1]);
}
void build6() {
	for (int i = 1; i <= n; i++) if (a[i] < 0) st6[i][0] = a[i]; else st6[i][0] = -INF;
	for (int j = 1; (1 << j) <= n; j++) 
		for (int i = 1; i + (1 << j) - 1 <= n; i++)
			st6[i][j] = max(st6[i][j - 1], st6[i + (1 << j - 1)][j - 1]);
}
int query1(int l, int r) {
	int k = log2(r - l + 1);
    return max(st1[l][k], st1[r - (1 << k) + 1][k]);
}
int query2(int l, int r) {
	int k = log2(r - l + 1);
    return max(st2[l][k], st2[r - (1 << k) + 1][k]);
}
int query3(int l, int r) {
	int k = log2(r - l + 1);
    return min(st3[l][k], st3[r - (1 << k) + 1][k]);
}
int query4(int l, int r) {
	int k = log2(r - l + 1);
    return min(st4[l][k], st4[r - (1 << k) + 1][k]);
}
int query5(int l, int r) {
	int k = log2(r - l + 1);
    return min(st5[l][k], st5[r - (1 << k) + 1][k]);
}
int query6(int l, int r) {
	int k = log2(r - l + 1);
    return max(st6[l][k], st6[r - (1 << k) + 1][k]);
}
signed main() {
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i <= m; i++)
		cin >> b[i];
	build1();
	build2();
	build3();
	build4();
	build5();
	build6();
	for (int i = 1; i <= q; i++) {
		int l1, r1, l2, r2;
		cin >> l1 >> r1 >> l2 >> r2;
		int ans1, ans2;
		int t2 = query2(l2, r2), t4 = query4(l2, r2), t3 = query3(l1, r1), t6 = query6(l1, r1), t5 = query5(l1, r1), t1 = query1(l1, r1);
		//cout << query3(l1, r1) << query1(l1, r1) << endl; 
		if (t2 < 0) ans1 = t2 * t3;
		else if (t6 != -INF) ans1 = t2 * t6;
		else ans1 = -INF;
		if (t4 >= 0) ans2 = t4 * t1;
		else if (t5 != INF) ans2 = t4 * t5;
		else ans2 = INF;
		cout << max(ans1, ans2) << endl;
	} 
	return 0;
} 
2024/8/12 11:21
加载中...