蒟蒻求助 90 分
查看原帖
蒟蒻求助 90 分
366455
西湖水妖楼主2022/10/29 21:38

都是特殊性质 2 的。

#include <bits/stdc++.h>
using namespace std;

unsigned q, m, len, l1, r1, l2, r2;
long long xa, pna, nxa, na, xb, pnb, nxb, nb;
bool flaga, flagb;
array<unsigned, 2> n;
array<unsigned, 1000000> Log;
array<array<long long, 1000000>, 2> a;
array<array<array<long long, 25>, 1000000>, 2> ax, an,
apn, anx;

inline long long query_max(
const array<array<long long, 25>, 1000000> &a,
const unsigned &L, const unsigned &R)
{
	len = Log[R - L];
	return max(a[L][len], a[R - (1u << len)][len]);
}
inline long long query_min(
const array<array<long long, 25>, 1000000> &a,
const unsigned &L, const unsigned &R)
{
	len = Log[R - L];
	return min(a[L][len], a[R - (1u << len)][len]);
}

int main()
{
	//freopen("game.in", "r", stdin);
	//freopen("game.out", "w", stdout);
	scanf("%u%u%u", &n[0], &n[1], &q);
	m = max(++ n[0], ++ n[1]);

	for(unsigned i(2u); i != m; ++ i)
		Log[i] = Log[i >> 1] + 1u;

	for(unsigned k(0u); k != 2u; ++ k)
		for(unsigned i(1u); i != n[k]; ++ i)
		{
			scanf("%lld", &a[k][i]);
			ax[k][i][0] = an[k][i][0] = a[k][i];
			if(a[k][i] >= 0ll)
				apn[k][i][0] = a[k][i];
			else
				apn[k][i][0] = INT_MAX;
			if(a[k][i] <= 0ll)
				anx[k][i][0] = a[k][i];
			else
				anx[k][i][0] = INT_MIN;
		}

	for(unsigned k(0u); k != 2u; ++ k)
		for(unsigned j(1u); j != 25u; ++ j)
			for(unsigned i(1u); i + (1u << j) <= n[k]; ++ i)
				ax[k][i][j] = max(ax[k][i][j - 1],
ax[k][i + (1u << j - 1u)][j - 1]);
	for(unsigned k(0u); k != 2u; ++ k)
		for(unsigned j(1u); j != 25u; ++ j)
			for(unsigned i(1u); i + (1u << j) <= n[k]; ++ i)
				anx[k][i][j] = max(anx[k][i][j - 1],
anx[k][i + (1u << j - 1u)][j - 1]);
	for(unsigned k(0u); k != 2u; ++ k)
		for(unsigned j(1u); j != 25u; ++ j)
			for(unsigned i(1u); i + (1u << j) <= n[k]; ++ i)
				an[k][i][j] = min(an[k][i][j - 1],
an[k][i + (1u << j - 1u)][j - 1]);
	for(unsigned k(0u); k != 2u; ++ k)
		for(unsigned j(1u); j != 25u; ++ j)
			for(unsigned i(1u); i + (1u << j) <= n[k]; ++ i)
				apn[k][i][j] = min(apn[k][i][j - 1],
apn[k][i + (1u << j - 1u)][j - 1]);

	do
	{
		scanf("%u%u%u%u", &l1, &r1, &l2, &r2);
		++ r1;
		++ r2;
		xa = query_max(ax[0], l1, r1);
		pna = query_min(apn[0], l1, r1);
		nxa = query_max(anx[0], l1, r1);
		na = query_min(an[0], l1, r1);
		xb = query_max(ax[1], l2, r2);
		pnb = query_min(apn[1], l2, r2);
		nxb = query_max(anx[1], l2, r2);
		nb = query_min(an[1], l2, r2);

		if(xb > 0ll)
		{
			if(nb < 0ll)
				printf("%lld\n", max(pna * nb,
nxa * xb));
			else if(xa > 0ll)
				printf("%lld\n", xa * nb);
			else
				printf("%lld\n", xa * xb);
		}
		else
			if(na < 0ll)
				printf("%lld\n", na * xb);
			else
				printf("%lld\n", na * nb);
	} while(-- q);

	//fclose(stdin);
	//fclose(stdout);
	return 0;
}
2022/10/29 21:38
加载中...