样例3输出有很多个0(似乎unsigned long long都开了),提交0分
#include<bits/stdc++.h>
using namespace std;
int t,n,Q,A[300000],B[300000],top1,top2;
unsigned long long a[300000],b[300000],ans[300000];
struct node
{
int l,r,id;
}q[300000];
struct tree
{
unsigned long long a,b,s,ab,lazya,lazyb,ja,jb,jab,j;
}tr[1100000];
inline bool cmp(node x,node y)
{
return x.r<y.r;
}
inline void gmc(int k,int l,int r,unsigned long long lazya,unsigned long long lazyb,unsigned long long j,unsigned long long ja,unsigned long long jb,unsigned long long jab)
{
tree hhz=tr[k];
if(!tr[k].lazya&&!tr[k].lazyb)
{
hhz.ja+=ja;
hhz.jb+=jb;
hhz.jab+=jab;
hhz.j+=j;
}
else if(!tr[k].lazya)
{
hhz.ja+=hhz.lazyb*jab+ja;
hhz.j+=hhz.lazyb*jb+j;
}
else if(!tr[k].lazyb)
{
hhz.jb+=hhz.lazya*jab+jb;
hhz.j+=hhz.lazya*ja+j;
}
else
{
hhz.jab+=hhz.lazya*hhz.lazyb*jab+hhz.lazya*ja+hhz.lazyb*jb+jab;
}
if(lazya)hhz.lazya=lazya;
if(lazyb)hhz.lazyb=lazyb;
hhz.s+=j*(unsigned long long)(r-l+1)+ja*hhz.a+jb*hhz.b+jab*hhz.ab;
if(lazya&&lazyb)
{
hhz.ab=(unsigned long long)(r-l+1)*lazya*lazyb;
hhz.a=(unsigned long long)(r-l+1)*lazya;
hhz.b=(unsigned long long)(r-l+1)*lazyb;
}
else if(lazya)
{
hhz.ab=lazya*hhz.b;
hhz.a=(unsigned long long)(r-l+1)*lazya;
}
else if(lazyb)
{
hhz.ab=lazyb*hhz.a;
hhz.b=(unsigned long long)(r-l+1)*lazyb;
}
tr[k]=hhz;
}
inline void pushdown(int k,int l,int r)
{
if(tr[k].lazya||tr[k].lazyb||tr[k].ja||tr[k].jb||tr[k].jab||tr[k].j)
{
int mid=(l+r)>>1;
gmc(k<<1,l,mid,tr[k].lazya,tr[k].lazyb,tr[k].j,tr[k].ja,tr[k].jb,tr[k].jab);
gmc(k<<1|1,mid+1,r,tr[k].lazya,tr[k].lazyb,tr[k].j,tr[k].ja,tr[k].jb,tr[k].jab);
tr[k].lazya=tr[k].lazyb=tr[k].ja=tr[k].jb=tr[k].jab=tr[k].j=0;
}
}
inline void pushup(int k)
{
tr[k].s=tr[k<<1].s+tr[k<<1|1].s;
tr[k].a=tr[k<<1].a+tr[k<<1|1].a;
tr[k].b=tr[k<<1].b+tr[k<<1|1].b;
tr[k].ab=tr[k<<1].ab+tr[k<<1|1].ab;
}
inline void updatea(int k,int l,int r,int x,int y,unsigned long long v)
{
if(l>=x&&r<=y)
{
gmc(k,l,r,v,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0);
return;
}
int mid=(l+r)>>1;
pushdown(k,l,r);
if(x<=mid)updatea(k<<1,l,mid,x,y,v);
if(y>=mid+1)updatea(k<<1|1,mid+1,r,x,y,v);
pushup(k);
}
inline void updateb(int k,int l,int r,int x,int y,unsigned long long v)
{
if(l>=x&&r<=y)
{
gmc(k,l,r,(unsigned long long)0,v,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0);
return;
}
int mid=(l+r)>>1;
pushdown(k,l,r);
if(x<=mid)updateb(k<<1,l,mid,x,y,v);
if(y>=mid+1)updateb(k<<1|1,mid+1,r,x,y,v);
pushup(k);
}
inline void update(int k,int l,int r,int x,int y)
{
if(l>=x&&r<=y)
{
gmc(k,l,r,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)1);
return;
}
int mid=(l+r)>>1;
pushdown(k,l,mid);
if(x<=mid)update(k<<1,l,mid,x,y);
if(y>=mid+1)update(k<<1|1,mid+1,r,x,y);
pushup(k);
}
inline unsigned long long query(int k,int l,int r,int x,int y)
{
if(l>=x&&r<=y)return tr[k].s;
pushdown(k,l,r);
int mid=(l+r)>>1;
unsigned long long ANS=0;
if(x<=mid)ANS+=query(k<<1,l,mid,x,y);
if(y>=mid+1)ANS+=query(k<<1|1,mid+1,r,x,y);
return ANS;
}
int main()
{
scanf("%d%d",&t,&n);
for(int i=1;i<=n;++i)scanf("%llu",&a[i]);
for(int i=1;i<=n;++i)scanf("%llu",&b[i]);
a[0]=1145141919810;
b[0]=1145141919810;
top1=top2=1;
scanf("%d",&Q);
for(int i=1;i<=Q;++i)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+1,q+Q+1,cmp);
int now=0;
for(int i=1;i<=Q;++i)
{
while(now+1<=q[i].r)
{
++now;
updatea(1,1,n,now,now,a[now]);
while(top1&&a[A[top1]]<a[now])
{
updatea(1,1,n,A[top1-1]+1,A[top1],a[now]);
--top1;
}
A[++top1]=now;
updateb(1,1,n,now,now,b[now]);
while(top2&&b[B[top2]]<b[now])
{
updateb(1,1,n,B[top2-1]+1,B[top2],b[now]);
--top2;
}
B[++top2]=now;
update(1,1,n,1,now);
//cout<<query(1,1,n,1,1)<<' '<<query(1,1,n,2,2)<<endl;
//cout<<query(1,1,n,1,now);
}
//cout<<q[i].l<<' '<<q[i].r<<' '<<query(1,1,n,q[i].l,q[i].r)<<endl;
ans[q[i].id]=query(1,1,n,q[i].l,q[i].r);
}
for(int i=1;i<=Q;++i)printf("%llu\n",ans[i]);
}