40pts 求条 马蜂良好
查看原帖
40pts 求条 马蜂良好
533102
monodev楼主2024/10/24 20:57
#include <iostream>
#include <cmath>
using namespace std;

const int MAXN = 1e5 + 1;
const int LOGMAXN = 17;
const long long INF = 0x3fffffffffffffff;

long long a[MAXN], b[MAXN];

long long maxA[MAXN][LOGMAXN], minA[MAXN][LOGMAXN];
long long maxNegA[MAXN][LOGMAXN], minPosA[MAXN][LOGMAXN];
long long maxB[MAXN][LOGMAXN], minB[MAXN][LOGMAXN];

void createST(long long table[][LOGMAXN], long long value[], int n, int logn, long long (*f)(long long, long long)) {
	for(int i = 0; i < n; ++ i)
		table[i][0] = value[i];
	for(int k = 1; k <= logn; ++k)
		for(int i = 0; i <= n - (1 << k); ++i)
			table[i][k] = f(table[i][k - 1], table[i + (1 << (k - 1))][k - 1]);
}

long long query(long long table[][LOGMAXN], int l, int r, long long (*f)(long long, long long)) {
	++r;
	int k = (int)log2(r - l);
	return f(table[l][k], table[r - (1 << k)][k]);
}

long long maxLL(long long a, long long b){
	return max(a, b);
}
long long minLL(long long a, long long b){
	return min(a, b);
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int n, m, q;
	cin >> n >> m >> q;
	for(int i = 0; i < n; ++i)
		cin >> a[i];
	for(int i = 0; i < m; ++i)
		cin >> b[i];
	
	createST(maxA, a, n, (int)log2(n), maxLL);
	createST(minA, a, n, (int)log2(n), minLL);
	createST(maxB, b, m, (int)log2(m), maxLL);
	createST(minB, b, m, (int)log2(m), minLL);
	for(int i = 0; i < n; ++i)
		b[i] = a[i] <= 0 ? a[i] : -INF;
	createST(maxNegA, b, n, (int)log2(n), maxLL);
	for(int i = 0; i < n; ++i)
		b[i] = a[i] >= 0 ? a[i] : INF;
	createST(minPosA, b, n, (int)log2(n), minLL);
	
//	for(int k = 0; k < 17; ++k) {
//		for(int i = 0; i <= n - (1 << k); ++i)
//			cout << maxNegA[i][k] << ' ';
//		cout << endl;
//	}
//	while(true) {
//		int l, r;
//		cin >> l >> r;
//		cout << query(maxB, l, r, maxLL) << endl;
//	}
	
	for(int i = 0; i < q; ++ i) {
		int l1, r1, l2, r2;
		cin >> l1 >> r1 >> l2 >> r2;
		--l1;
		--r1;
		--l2;
		--r2;
		if(query(maxB, l2, r2, maxLL) < 0) {		// forall B[l2 ~ r2] < 0
			cout << (long long)query(minA, l1, r1, minLL) * query(maxB, l2, r2, maxLL);
		} else if(query(minB, l2, r2, minLL) > 0) {	// forall B[l2 ~ r2] > 0
			cout << (long long)query(maxA, l1, r1, maxLL) * query(minB, l2, r2, minLL);
		} else {
			cout << max((long long)query(minPosA, l1, r1, minLL) * query(minB, l2, r2, minLL), (long long)query(maxNegA, l1, r1, maxLL) * query(maxB, l2, r2, maxLL));
		}
		cout << endl;
	}
	
	return 0;
}
2024/10/24 20:57
加载中...