线段树方法求调 码风良好
查看原帖
线段树方法求调 码风良好
760859
Let_Fly楼主2023/7/24 16:02
#include<bits/stdc++.h>
using namespace std;

#define int long long

const int N=1e5+5;

namespace ae86 {
	const int bufl = 1 << 15;
	char buf[bufl], *s = buf, *t = buf;
	inline int fetch() {
		if (s == t) { t = (s = buf) + fread(buf, 1, bufl, stdin); if (s == t) return EOF; }
		return *s++;
	}
	inline int read() {
		int a = 0, b = 1, c = fetch();
		while (!isdigit(c))b ^= c == '-', c = fetch();
		while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
		return b ? a : -a;
	}
}
using ae86::read;

int n,m;
struct Tree{
    int sy,sx=99999999999;
}tr[N<<5];
int h[N<<1],d[N<<1];
int qzh[N<<1];

void pushup(int u){
    tr[u].sy=max(tr[u].sy,max(tr[u<<1].sy,tr[u<<1|1].sy));
    tr[u].sx=min(tr[u].sx,min(tr[u<<1].sx,tr[u<<1|1].sx));
}

void build(int u,int l=1,int r=2*n){
    if(l==r){
        tr[u].sy=qzh[l]+2*h[l];
        tr[u].sx=qzh[l]-2*h[l];
        return;
    }
    int mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}

int query(int u,int l,int r,int mood,int L=1,int R=2*n){
    if(l<=L&&R<=r){
        if(mood)return tr[u].sy;
        else return tr[u].sx;
    }else{
        int mid=L+R>>1,lans=0,rans=0;
        if(l<=mid)lans=query(u<<1,l,r,mood,L,mid);
        if(r>mid)rans=query(u<<1|1,l,r,mood,mid+1,R);
        if(mood)return max(lans,rans);
        else return min(lans,rans);
    }
}

signed main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++)d[n+i%n+1]=d[i%n+1]=read();
    for(int i=1;i<=n;i++)h[n+i]=h[i]=read();
    for(int i=1;i<=2*n;i++)qzh[i]=qzh[i-1]+d[i];
    build(1);
    while(m--){
        int l=read(),r=read();
        if(l<r){
            swap(l,r);r+=n;//l++,r+=n-1;
            int mx=query(1,l,r,1),mn=query(1,l,r,0);
            cout<<mx-mn<<'\n';
        }else{
            swap(l,r);//l++,r--;
            int mx=query(1,l,r,1),mn=query(1,l,r,0);
            cout<<mx-mn<<'\n';
        }
    }
    return 0;
}
2023/7/24 16:02
加载中...