RT,不知道为什么爆零了,有没有选手和我的情况一样,能帮我看看代码
是一个n方的ST表()
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<climits>
#include<cstring>
using namespace std;
#define LEN 5005
#define ll long long
#define for1(i,n) for(int i=1;i<=n;i++)
int n,m,qp;
long long a[LEN],b[LEN],c[LEN][LEN];
long long stmaxb[LEN][LEN],stminb[LEN][LEN],stmaxa[LEN][LEN],stmina[LEN][LEN];
ll read(){
ll f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return f*x;
}
void write(ll x){
if(x<0){putchar('-');x=-x;}
if(x>=10){write(x/10);}
putchar(x%10+'0');
}
void init1(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
c[i][j]=a[i]*b[j];
}
}
}
void init2(){
for(int i=1;i<=n;i++){
stmaxa[i][1]=stmina[i][1]=a[i];
}
for(int j=2;j<=n;j++){
for(int i=1;i<=n-j+1;i++){
stmaxa[i][j]=max(stmaxa[i][j-1],a[i+j-1]);
stmina[i][j]=min(stmina[i][j-1],a[i+j-1]);
}
}
for(int i=1;i<=m;i++){
stminb[i][1]=stmaxb[i][1]=b[i];
}
for(int j=2;j<=m;j++){
for(int i=1;i<=m-j+1;i++){
stmaxb[i][j]=max(stmaxb[i][j-1],b[i+j-1]);
stminb[i][j]=min(stminb[i][j-1],b[i+j-1]);
}
}
}
void work(ll l1,ll r1,ll l2,ll r2){
ll ans=LLONG_MIN;
for(int j=l1;j<=r1;j++){
ll minn=LLONG_MAX;
for(int k=l2;k<=r2;k++){
minn=min(minn,c[j][k]);
}
ans=max(ans,minn);
}
//printf("%lld\n",ans);
write(ans);
}
int main(){
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
n=read(),m=read(),qp=read();
bool fag=true;
for(int i=1;i<=n;i++){
a[i]=read();
if(a[i]<=0){fag=false;}
}
for(int i=1;i<=m;i++){
b[i]=read();
if(b[i]<=0){fag=false;}
}
if(!fag&&n<=1500&&m<=1500&&qp<=1500){init1();}
else{init2();}
init2();
for(int i=1;i<=qp;i++){
ll p,q,r,s;
p=read(),q=read(),r=read(),s=read();
// Special 2
if(p==q){
ll tmp1=stmaxb[r][s-r+1]*a[p],tmp2=stminb[r][s-r+1]*a[p];
write(min(tmp1,tmp2));
putchar('\n');
continue;
}
if(r==s){
ll tmp1=stmaxa[p][q-p+1]*b[r],tmp2=stmina[p][q-p+1]*b[r];
write(max(tmp1,tmp2));
putchar('\n');
continue;
}
// Special 1
if(fag){
ll u=stmaxa[p][q-p+1],v=stminb[r][s-r+1];
write(u*v);
putchar('\n');
continue;
}
// Small cases
work(p,q,r,s);
putchar('\n');
}
return 0;
}