比赛 20150421 评测结果 AAAAAAAA
题目名称 山海经 最终得分 100
用户昵称 JSX 运行时间 0.961 s
代码语言 C++ 内存使用 22.28 MiB
提交时间 2015-04-21 10:48:44
显示代码纯文本
#include <cmath>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
template<class T>inline void Read(T& x) {
	x = 0; bool flag = 0; char ch = getchar();
	while(ch<'0'||ch>'9') { if(ch == '-') flag = 1; ch = getchar(); }
	while('0'<=ch&&ch<='9') { x=x*10+ch-'0'; ch = getchar(); }
	if(flag) x=-x;
}
#define maxn 200010
int a[maxn];
struct tree {
	int L,R,M,S;
	int lc,rc,ml,mr;
	tree() { L = R = M = S = lc = rc = ml = mr = 0 ;}
}T[maxn << 2];
#define left (o << 1)
#define right (o << 1 | 1)
inline tree update(tree x,tree y) {
	tree res;
	res.L = x.L;   res.lc = x.lc; 
	res.R = y.R;   res.rc = y.rc;   
	res.ml = x.ml; res.mr = x.mr; res.M = x.M;
	res.S = x.S + y.S;
	if(x.S+y.L > res.L) res.L = x.S+y.L,res.lc = y.lc;
	if(x.R+y.S >=res.R) res.R = x.R+y.S,res.rc = x.rc;
	if(x.R+y.L > res.M) res.M = x.R+y.L,res.ml = x.rc,res.mr = y.lc;  
	if(y.M > res.M) res.M = y.M,res.ml = y.ml,res.mr = y.mr;
	return res;
}
inline void build(int o,int l,int r) {
	if(l == r) {
		T[o].S = T[o].L = T[o].R = T[o].M = a[l];
		T[o].lc = T[o].rc = T[o].ml = T[o].mr = l;
		return ;
	}
	int mid = (l + r) >> 1;
	build(left,l,mid);
	build(right,mid+1,r);
	T[o] = update(T[left],T[right]);
}
int Qx = 0,Qy = 0;
inline tree query(int o,int l,int r) {
	if(Qx <= l && r <= Qy) return T[o];
	int mid = (l + r) >> 1;
	if(Qy <= mid) return query(left, l , mid);
	else if(Qx >  mid) return query(right,mid+1,r);
	else {
		tree x,y;
		x = query(left, l , mid);
		y = query(right,mid+1,r);
		return update(x,y);
	}
}
int main() {
	freopen("hill.in","r",stdin);
	freopen("hill.out","w",stdout);
	int n = 0,m = 0;
	Read(n); Read(m);
	for(int i = 1;i <= n;++ i) Read(a[i]);
	build(1,1,n);
	tree tmp; 
	while(m --) {
		Read(Qx); Read(Qy);
		tmp = query(1,1,n);
		printf("%d %d %d\n",tmp.ml,tmp.mr,tmp.M);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}