比赛 20150421 评测结果 AAAAAAAA
题目名称 山海经 最终得分 100
用户昵称 真呆菌 运行时间 1.278 s
代码语言 C++ 内存使用 31.73 MiB
提交时间 2015-04-21 09:08:54
显示代码纯文本
#include<cstdio>
using namespace std;
const int N = 201000;
const int M = 101000;
using namespace std;
int Max(int x,int y){if(x>y) return x;return y;}
struct SegTree{int lx,rx,sx,sum,lln,rrn,ln,rn,l,r;}T[N<<2],res;
int n,m,seq[N],L,R;

bool Cmp(int a,int b,int la,int lb,int ra,int rb){
	if(a<b) return 1;
	if(a==b&&la>lb) return 1;
	if(a==b&&la==lb&&ra>rb) return 1;
	return 0;
}

SegTree operator + (const SegTree &a,const SegTree &b){
	SegTree t;
	t.l=a.l;t.r=b.r;
	t.sum=a.sum+b.sum;t.sx=t.sum;
	t.lx=a.lx;t.lln=a.lln;t.ln=t.l;
	t.rx=b.rx;t.rrn=b.rrn;t.rn=t.r;
	if(Cmp(t.lx,a.sum+b.lx,t.l,t.l,t.lln,b.lln)) t.lx=a.sum+b.lx,t.lln=b.lln;
	if(Cmp(t.rx,b.sum+a.rx,t.rrn,a.rrn,t.r,t.r)) t.rx=b.sum+a.rx,t.rrn=a.rrn;
	if(Cmp(t.sx,a.sx,t.ln,a.ln,t.rn,a.rn)) t.sx=a.sx,t.ln=a.ln,t.rn=a.rn;
	if(Cmp(t.sx,b.sx,t.ln,b.ln,t.rn,b.rn)) t.sx=b.sx,t.ln=b.ln,t.rn=b.rn;
	if(Cmp(t.sx,t.lx,t.ln,t.l,t.rn,t.lln)) t.sx=t.lx,t.ln=t.l,t.rn=t.lln;
	if(Cmp(t.sx,t.rx,t.ln,t.rrn,t.rn,t.r)) t.sx=t.rx,t.ln=t.rrn,t.rn=t.r;
	if(Cmp(t.sx,a.rx+b.lx,t.ln,a.rrn,t.rn,b.lln)) t.sx=a.rx+b.lx,t.ln=a.rrn,t.rn=b.lln;
	return t;
}
 
void  Build(int a,int l,int r){
	if(l==r){T[a]=(SegTree){seq[l],seq[l],seq[l],seq[l],l,r,l,r,l,r};return;}
	int mid=(l+r)>>1;
	Build(a<<1,l,mid);
	Build(a<<1|1,mid+1,r);
	T[a]=T[a<<1]+T[a<<1|1];
	return;
}

SegTree Query(int a){
	if(T[a].l>=L&&T[a].r<=R) return T[a];
	int mid=(T[a].l+T[a].r)>>1;
	if(R<=mid) return Query(a<<1);
	if(L>mid) return Query(a<<1|1);
	else return Query(a<<1)+Query(a<<1|1);
}
int main(){
	#define READ
	#ifdef READ
		freopen("hill.in","r",stdin);
		freopen("hill.out","w",stdout);
	#endif
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&seq[i]);
	Build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&L,&R);
		res=Query(1);
		printf("%d %d %d\n",res.ln,res.rn,res.sx);
	}
	return 0;
}