打的52pts分治做法,不知道为什么,本地运行时样例全过,但是交上去十几遍都是全WA,结果编译警告告诉我是因为分治时[++tp]编译成的未定义操作,改成tp++放在前面就过了,球球大佬帮我看看是什么原因qwq
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int M=4e6+7;
int n,u,ql,qr,a[M],b[M];
int amx[M],bmx[M],tp=0,sum[M],suma[M],sumb[M],q;
int solve(int l,int r){
if(l==r)return a[l]*b[l];
//if(r - l == 1) return a[l] * b[l] + a[r] * b[r] + max(a[l],a[r]) * max(b[l],b[r]);
int mid=(l+r)>>1ULL;
int res=solve(l,mid)+solve(mid+1,r);
tp=0;
for(int i=mid+1;i<=r;i++){
tp++;
amx[tp]=max(amx[tp-1],a[mid+tp]);
bmx[tp]=max(bmx[tp-1],b[mid+tp]);
sum[tp]=sum[tp-1]+amx[tp]*bmx[tp];
suma[tp]=suma[tp-1]+amx[tp];
sumb[tp]=sumb[tp-1]+bmx[tp];
}
int nowa=0,nowb=0;
for(int i=mid;i>=l;i--){
nowa=max(nowa,a[i]);
nowb=max(nowb,b[i]);
int konga=upper_bound(amx+1,amx+tp+1,nowa)-amx-1;
int kongb=upper_bound(bmx+1,bmx+tp+1,nowb)-bmx-1;
konga=max(konga,0ULL);kongb=max(kongb,0ULL);
if(konga>kongb){
res+=kongb*nowa*nowb;
res+=(sumb[konga]-sumb[kongb])*nowa;
res+=sum[tp]-sum[konga];
}else{
res+=konga*nowb*nowa;
res+=(suma[kongb]-suma[konga])*nowb;
res+=sum[tp]-sum[kongb];
}
}
//cout<<l<<" "<<r<<" "<<res<<endl;
return res;
}
signed main(){
//freopen("shujv.txt","r",stdin);
//freopen("std1.txt","w",stdout);
scanf("%*llu%llu",&n);
for(int i=1;i<=n;i++){
scanf("%llu",&a[i]);
}
for(int i=1;i<=n;i++){
scanf("%llu",&b[i]);
}
scanf("%llu",&q);
while(q--){
scanf("%llu%llu",&ql,&qr);
printf("%llu\n",solve(ql,qr));
}
return 0;
}