救救孩子,本地re
查看原帖
救救孩子,本地re
382512
HINODE楼主2021/12/25 11:42
#include<bits/stdc++.h>
using namespace std;
const int N=114514,inf=-1000000000;
int a[N<<1],h[N<<1],n,m,t[N<<1],x,y,d;
struct whatever{
	#define lc p<<1
	#define rc p<<1|1
	#define mid (f[p].l+f[p].r>>1)
	#define emp (orz127){0,0,0,0,0}
	struct orz127{
		int l,r,up,lo,ans;
		void clear(){up=lo=ans=inf;return;}
		orz127 operator+(orz127 a){
			orz127 c;
			c.up=max(up,a.up);c.lo=max(lo,a.lo);
			c.ans=max(max(ans,a.ans),lo+a.up);
			return c;
		}
	}f[N<<3];
	void build(int p,int l,int r){
		f[p].l=l;f[p].r=r;
		if(l==r){
			f[p].clear();
			f[p].lo=h[r]*2-t[r-1];
			f[p].up=h[r]*2+t[r-1];
			return;
		}
		build(lc,l,mid);build(rc,mid+1,r);
		f[p]=f[lc]+f[rc];
	}
	orz127 query(int p,int l,int r){
		if(l>r)return emp;
		if(l<=f[p].l&&r>=f[p].r)return f[p];
		orz127 sa;sa.clear();
		if(l<=mid)sa=sa+query(lc,l,r);
		if(r>mid)sa=sa+query(rc,l,r);
		return sa;
	}
}lzj;
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){scanf("%d",&a[i]);a[i+n]=a[i];}
	for(int i=1;i<=n;++i){scanf("%d",&h[i]);h[i+n]=h[i];}n*=2;
	for(int i=1;i<=n;++i)t[i]=a[i]+t[i-1];
	lzj.build(1,1,n);
	//cout<<n;
	//printf("   %d %d",lzj.f[1].l,lzj.f[1].r);
	//for(int i=1;i<=n*2;++i)cout<<f[i].l<<' '<<f[i].r<<endl;
	for(int i=1;i<=m;++i){
		scanf("%d%d",&x,&y);
		if(x<=y)d=lzj.query(1,y+1,x+(n>>1)-1).ans;
		else d=lzj.query(1,y+1,x-1).ans;
		printf("%d\n",d);
	}
	return 0;
}

2021/12/25 11:42
加载中...