记录编号 159023 评测结果 AAAAAAAA
题目名称 山海经 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.815 s
提交时间 2015-04-19 06:33:28 内存使用 28.55 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <queue>
#include <stack>

using namespace std;

#ifdef WIN32
	#define IMT "%I64d"
#else
	#define IMT "%lld"
#endif

#define MINE

#define N 200010
#define l(x) ch[x][0]
#define r(x) ch[x][1]
#define out(x) cout<<#x<<" = "<<x<<endl;
#define PB(x) push_back(x)
#define MP(x) make_pair(x)

template<class T> inline char qread(T &x){
	static char ch;
	int k=1;
	while(!isdigit(ch=getchar())) if(ch=='-') k=-1;
	x=ch-'0';
	while(isdigit(ch=getchar()))
		x=(x<<1)+(x<<3)+ch-'0';
	x*=k;
	return ch;
}

void file(){
	 freopen("hill.in","r",stdin);
	 #ifdef MINE
	 freopen("hill.out","w",stdout);
	 #endif
}

#define ls(x) tree[x].ls
#define rs(x) tree[x].rs
#define lt(x) tree[x].lt
#define rt(x) tree[x].rt
#define lm(x) tree[x].mlt
#define rm(x) tree[x].mrt
#define sum(x) tree[x].sum
#define ms(x) tree[x].ms

struct node{
	int ls,rs,ms,lt,rt,sum,mlt,mrt;
}tree[N<<2];

int ch[N<<1][2],tot,a[N],n,m,cnt;

void update(int o){
	if(!l(o)) return;
	sum(o)=sum(l(o))+sum(r(o));
	if(ms(l(o))>=ms(r(o))){
		ms(o)=ms(l(o)); lm(o)=lm(l(o));
		rm(o)=rm(l(o));
	}
	else{
		ms(o)=ms(r(o)); lm(o)=lm(r(o));
		rm(o)=rm(r(o));
	}
	if(ls(r(o))+rs(l(o))>ms(o) ||
	ls(r(o))+rs(l(o))==ms(o) && (rm(o)>rt(l(o))
	|| rm(o)==rt(l(o))&&lm(o)>lt(r(o)))){
		ms(o)=ls(r(o))+rs(l(o));
		lm(o)=lt(r(o));
		rm(o)=rt(l(o));
	}
	if(ls(l(o))>=sum(l(o))+ls(r(o))){
		ls(o)=ls(l(o));
		lt(o)=lt(l(o));
	}
	else{
		ls(o)=sum(l(o))+ls(r(o));
		lt(o)=lt(r(o));
	}
	if(rs(r(o))>sum(r(o))+rs(l(o))){
		rs(o)=rs(r(o));
		rt(o)=rt(r(o));
	}
	else{
		rs(o)=sum(r(o))+rs(l(o));
		rt(o)=rt(l(o));
	}
}

int build(int l,int r){
	int x=++tot;
	if(l==r){
		lm(x)=rm(x)=lt(x)=rt(x)=l;
		sum(x)=ls(x)=rs(x)=ms(x)=a[l];
		return x;
	}
	int mid=(l+r)>>1;
	l(x)=build(l,mid); r(x)=build(mid+1,r);
	update(x);
	return x;
}

node ask(int o,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr) return tree[o];
	int mid=(l+r)>>1,lt,rt;
	if(ql<=mid && mid<qr){
		tree[lt=++tot] = ask(l(o),l,mid,ql,qr);
		tree[rt=++tot] = ask(r(o),mid+1,r,ql,qr);
		l(++tot)=lt;
		r(tot)=rt; update(tot);
		return tree[tot];
	}
	if(ql<=mid) return ask(l(o),l,mid,ql,qr);
	if(mid<qr) return ask(r(o),mid+1,r,ql,qr);
}

int main(){
	file();
	qread(n); qread(m);
	for(int i=1;i<=n;i++) qread(a[i]);
	build(1,n);
	cnt=tot;
	for(int i=1,l,r;i<=m;i++){
		qread(l); qread(r);
		//cout<<l<<' '<<r<<endl;
		tot=cnt;
		node ans=ask(1,1,n,l,r);
		//cout<<"debug\n";
		printf("%d %d %d\n",ans.mrt,ans.mlt,ans.ms);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}