样例没过
查看原帖
样例没过
540363
AKPC楼主2024/3/23 17:14
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mpr make_pair
#define fr first
#define sc second
inline int read(){
	int res=0,f=1;char c=getchar();
	while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
	return res*f;
}
const int N=1e5+5;
struct tree{
	int tg,mx,ltg,lmx;
};
struct sgm{
	#define lc(x) (x<<1)
	#define rc(x) (x<<1|1)
	tree s[N<<2];
	void push_up(int x){
		s[x].mx=max(s[lc(x)].mx,s[rc(x)].mx);
		s[x].lmx=max(s[lc(x)].lmx,s[rc(x)].lmx);
	}
	void add(int x,int nk,int k,int op){
		if (op==0){
			s[x].tg+=nk;
			s[x].mx+=nk;
		}
		s[x].lmx=max(s[x].lmx,s[x].mx+k);
		s[x].ltg=max(s[x].ltg,s[x].tg+k);
		if (op==1){
			s[x].tg+=nk;
			s[x].mx+=nk;
		}
	}
	void push_down(int x){
		add(lc(x),s[x].tg,s[x].ltg,1);
		add(rc(x),s[x].tg,s[x].ltg,1);
		s[x].tg=s[x].ltg=0;
	}
	void modify(int x,int ql,int qr,int l,int r,int k){
		if (ql<=l&&qr>=r){
			add(x,k,0,0);
			return;
		}
		push_down(x);
		int mid=(l+r)>>1;
		if (ql<=mid) modify(lc(x),ql,qr,l,mid,k);
		if (qr>mid) modify(rc(x),ql,qr,mid+1,r,k);
		push_up(x);
	}
	int query(int x,int ql,int qr,int l,int r){
		if (ql<=l&&qr>=r) return s[x].lmx;
		int res=0,mid=(l+r)>>1;
		push_down(x);
		if (ql<=mid) res=max(query(lc(x),ql,qr,l,mid),res);
		if (qr>mid) res=max(query(rc(x),ql,qr,mid+1,r),res);
		push_up(x); 
		return res;
	}
	#undef lc
	#undef rc
}book;
int n,m,f[N],a[N],mp[N<<1],output[N];
struct query{
	int x,y,i;
	bool operator<(const query &o)const{
		return y<o.y;
	}
}q[N];
signed main(){
	n=read();
	for (int i=1;i<=n;i++){
		a[i]=read();
	    f[i]=mp[a[i]+N]+1;
	    mp[a[i]+N]=i;
	}
	m=read();
    for (int i=1;i<=m;i++){
        int x=read(),y=read();
        q[i]={x,y,i};
	}
	for (int i=0;i<=(N<<2);i++){
		book.s[i].lmx=-1e18;
	}
	sort(q+1,q+m+1);
	int tip=1;
	for (int i=1;i<=m;i++){
	    while (tip<=q[i].y&&tip<=n) book.modify(1,f[tip],tip,1,n,a[tip++]);
		output[q[i].i]=book.query(1,q[i].x,q[i].y,1,n);
	}
	for (int i=1;i<=m;i++) cout<<output[i]<<'\n';
	return 0;
}
2024/3/23 17:14
加载中...