八个st表,大测试点全WA了,写了两个晚上了
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long LL;
const LL MAX=1e18;
const LL MIN=-MAX;
//ÓÎÏ·
int n,m,q;
LL L[100003],Q[100003];
void read();
//st±í
int logn[1000003];
LL mx_all_L[100003][19]; LL search1(int,int);
LL mn_all_L[100003][19]; LL search2(int,int);
LL mx_ne_L [100003][19]; LL search3(int,int);
LL mn_po_L [100003][19]; LL search4(int,int);
LL mx_all_Q[100003][19]; LL search5(int,int);
LL mn_all_Q[100003][19]; LL search6(int,int);
LL mx_ne_Q [100003][19]; LL search7(int,int);
LL mn_po_Q [100003][19]; LL search8(int,int);
void lg();
void init();
//ÇóÖµ
LL find(int,int,int,int);
int main() {
lg();
read();
init();
while(q--){
int l1,r1,l2,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
// printf("%lld ",search1(l1,r1));
// printf("%lld ",search2(l1,r1));
// printf("%lld ",search3(l1,r1));
// printf("%lld ",search4(l1,r1));
// printf("%lld ",search5(l2,r2));
// printf("%lld ",search6(l2,r2));
// printf("%lld ",search7(l2,r2));
// printf("%lld\n",search8(l2,r2));
LL ans = find(l1,r1,l2,r2);
printf("%lld\n",ans);
}
return 0;
}
//¶ÁÈë
void read(){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
scanf("%lld",&L[i]);
for(int i=1;i<=m;i++)
scanf("%lld",&Q[i]);
}
//st±í
void lg(){
logn[1]=0,logn[2]=1;
for(int i=3;i<1000003;i++)
logn[i]=logn[i/2]+1;
}
void init() {
//¸³³õÖµ
for(int i=1;i<=n;i++) {
mx_all_L[i][0] = L[i];
mn_all_L[i][0] = L[i];
mx_ne_L [i][0] = L[i]<=0 ? L[i] : MIN;
mn_po_L [i][0] = L[i]>0 ? L[i] : MAX;
}
for(int i=1;i<=m;i++) {
mx_all_Q[i][0] = Q[i];
mn_all_Q[i][0] = Q[i];
mx_ne_Q [i][0] = Q[i]<=0 ? Q[i] : MIN;
mn_po_Q [i][0] = Q[i]>0 ? Q[i] : MAX;
}
//³õʼ»¯
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++) {
mx_all_L[i][j] = max( mx_all_L[i][j-1] , mx_all_L[i+(1<<(j-1))][j-1] );
mn_all_L[i][j] = min( mn_all_L[i][j-1] , mn_all_L[i+(1<<(j-1))][j-1] );
mx_ne_L [i][j] = max( mx_ne_L [i][j-1] , mx_ne_L [i+(1<<(j-1))][j-1] );
mn_po_L [i][j] = min( mn_po_L [i][j-1] , mn_po_L [i+(1<<(j-1))][j-1] );
}
for(int j=1;(1<<j)<=m;j++)
for(int i=1;i+(1<<j)-1<=m;i++) {
mx_all_Q[i][j] = max( mx_all_Q[i][j-1] , mx_all_Q[i+(1<<(j-1))][j-1] );
mn_all_Q[i][j] = min( mn_all_Q[i][j-1] , mn_all_Q[i+(1<<(j-1))][j-1] );
mx_ne_Q [i][j] = max( mx_ne_Q [i][j-1] , mx_ne_Q [i+(1<<(j-1))][j-1] );
mn_po_Q [i][j] = min( mn_po_Q [i][j-1] , mn_po_Q [i+(1<<(j-1))][j-1] );
}
}
LL search1 (int x , int y) {
int k=logn[y-x+1];
return max ( mx_all_L[x][k] ,
mx_all_L[y-(1<<k)+1][k] );
} LL search2 (int x , int y) {
int k=logn[y-x+1];
return min ( mn_all_L[x][k] ,
mn_all_L[y-(1<<k)+1][k] );
} LL search3 (int x , int y) {
int k=logn[y-x+1];
return max ( mx_ne_L [x][k] ,
mx_ne_L [y-(1<<k)+1][k] );
} LL search4 (int x , int y) {
int k=logn[y-x+1];
return min ( mn_po_L [x][k] ,
mn_po_L [y-(1<<k)+1][k] );
} LL search5 (int x , int y) {
int k=logn[y-x+1];
return max ( mx_all_Q[x][k] ,
mx_all_Q[y-(1<<k)+1][k] );
} LL search6 (int x , int y) {
int k=logn[y-x+1];
return min ( mn_all_Q[x][k] ,
mn_all_Q[y-(1<<k)+1][k] );
} LL search7 (int x , int y) {
int k=logn[y-x+1];
return max ( mx_ne_Q[x][k] ,
mx_ne_Q [y-(1<<k)+1][k] );
} LL search8 (int x , int y) {
int k=logn[y-x+1];
return min ( mn_po_Q[x][k] ,
mn_po_Q [y-(1<<k)+1][k] );
}
//´ð°¸
LL find(int l1,int r1,int l2,int r2){
//¶¨Òå±äÁ¿
// puts("@ ");
LL max_all_L = search1 (l1,r1) ;
LL min_all_L = search2 (l1,r1) ;
LL max_ne_L = search3 (l1,r1) ;
LL min_po_L = search4 (l1,r1) ;
LL max_all_Q = search5 (l2,r2) ;
LL min_all_Q = search6 (l2,r2) ;
LL max_ne_Q = search7 (l2,r2) ;
LL min_po_Q = search8 (l2,r2) ;
bool Q_po = (max_all_Q > 0) ;
bool Q_ne = (min_all_Q <= 0) ;
bool L_po = (max_all_L > 0) ;
bool L_ze = (max_ne_L == 0) ;
bool L_ne = (min_all_L <= 0) ;
// printf("%lld %lld %lld %lld %lld %lld %lld %lld \n",max_all_L,min_all_L,max_ne_L,min_po_L,max_all_Q,min_all_Q,max_ne_Q,min_po_Q);
// printf("%d %d %d %d %d \n",Q_po,Q_ne,L_po,L_ze,L_ne);
//¼ÆËã
LL ans=MIN;
// printf("%lld\n",ans);
if ( Q_po and !Q_ne ) {
if ( L_po ) {
// puts("A");
ans = max_all_L * min_po_Q ;
} else if( L_ze ) {
// puts("B");
ans = 0 ;
} else if( L_po ){
// puts("C");
ans = max_ne_L * max_all_Q ;
}
} else if( !Q_po and Q_ne ) {
if ( L_ne ) {
// puts("D");
ans = min_all_L * max_ne_Q ;
} else if ( L_ze ) {
// puts("E");
ans = 0 ;
} else if ( L_po ) {
// puts("F");
ans = min_po_L * min_all_Q ;
}
} else if( Q_po and Q_ne ) {
if ( L_ze ) {
// puts("G");
ans = 0 ;
} else {
if( L_po ){
// puts("H");
// printf("%lld\n",ans);
ans = max ( ans , min_po_L * min_all_Q ) ;
}
if( L_ne ){
// puts("I");
// printf("%lld\n",ans);
// printf("%lld %lld\n",max_ne_L,max_all_Q);
ans = max ( ans , max_ne_L * max_all_Q ) ;
}
}
}
// printf("%lld\n",ans);
return ans;
}