st表0分
查看原帖
st表0分
1063896
Mickey_miqi楼主2024/10/21 21:28
#include <bits/stdc++.h>
using namespace std;
#define N 100005
long long ans, st[7][N][20];
int n, m, q, l1, l2, r1, r2, a[N], b[N];
void init() {
    int t = log(n)/log(2) + 1;
    for (int i = 1; i <= n; i++) {
        st[1][i][0] = a[i];
        st[2][i][0] = a[i];
		st[5][i][0] = a[i]>=0?a[i]:0x3f3f3f3f3f3f3f3f;
    	st[6][i][0] = a[i]<0?a[i]:0xcfcfcfcfcfcfcfcf;
    }
    for (int j = 1; j <= t; j++) {
        for (int i = 1; i <= n-(1<<j)+1; i++) {
            st[1][i][j] = max(st[1][i][j-1], st[1][i+(1<<j-1)][j-1]);
            st[2][i][j] = min(st[2][i][j-1], st[2][i+(1<<j-1)][j-1]);
            st[5][i][j] = min(st[5][i][j-1], st[5][i+(1<<j-1)][j-1]);
            st[6][i][j] = max(st[6][i][j-1], st[6][i+(1<<j-1)][j-1]);
        } 
    }
    t = log(m)/log(2) + 1;
    for (int i = 1; i <= m; i++) {
        st[3][i][0] = b[i];
        st[4][i][0] = b[i];
    }
    for (int j = 1; j <= t; j++) {
        for (int i = 1; i <= m-(1<<j)+1; i++) {
            st[3][i][j] = max(st[3][i][j-1], st[3][i+(1<<j-1)][j-1]);
            st[4][i][j] = min(st[4][i][j-1], st[4][i+(1<<j-1)][j-1]);
        }
    }
}
long long query(int num, int l, int r) {
    int k = log(r-l+1)/log(2);
    if (num == 1) return max(st[1][l][k], st[1][r-(1<<k)+1][k]);
    else if (num == 2) return min(st[2][l][k], st[2][r-(1<<k)+1][k]);
    else if (num == 3) return max(st[3][l][k], st[3][r-(1<<k)+1][k]);
    else if (num == 4) return min(st[4][l][k], st[4][r-(1<<k)+1][k]);
    else if (num == 5) return min(st[5][l][k], st[5][r-(1<<k)+1][k]);
    else return max(st[6][l][k], st[6][r-(1<<k)+1][k]);
}
int main() {
//    freopen("game4.in", "r", stdin);
//    freopen("file.out", "w", stdout);
    scanf("%d%d%d", &n, &m, &q);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    for (int i = 1; i <= m; i++) {
        scanf("%d", &b[i]);
    }
    init();
    for (int i = 1; i <= q; i++) {
        scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
        long long a1 = query(1, l1, r1), a2 = query(2, l1, r1), a3 = query(3, l2, r2), a4 = query(4, l2, r2), a5 = query(5, l1, r1), a6 = query(6, l1, r1);
        ans = max(a1*a4, a2*a3);
        if (a5 != 0x3f3f3f3f3f3f3f3f) ans = max(a5*a4, ans);
        if (a6 != 0xcfcfcfcfcfcfcfcf) ans = max(a6*a3, ans);
    	printf("%lld\n", ans);
    }
    return 0;
}
2024/10/21 21:28
加载中...