记录编号 452618 评测结果 AAAAAAAA
题目名称 山海经 最终得分 100
用户昵称 GravatarBaDBoY 是否通过 通过
代码语言 C++ 运行时间 0.788 s
提交时间 2017-09-19 21:32:44 内存使用 16.63 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 0x7fffffff
int n,m;
struct node {
	int sum,l,r,mid;
	int l1,r1,l2,r2,l3,r3;
	int ll,rr;
	node() {
		sum=l=r=mid=-inf;
	}
} tree[4*100001],null;
int a[100005];
void pushup(int x) {
	tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
	if(tree[x<<1].l>=tree[x].l) {
		tree[x].l=tree[x<<1].l;
		tree[x].l1=tree[x<<1].l1;
		tree[x].r1=tree[x<<1].r1;
	}
	if(tree[x<<1].sum>tree[x].l) {
		tree[x].l=tree[x<<1].sum;
		tree[x].l1=tree[x<<1].ll;
		tree[x].r1=tree[x<<1].rr;
	}
	if(tree[x<<1].sum+tree[x<<1|1].l>tree[x].l) {
		tree[x].l=tree[x<<1].sum+tree[x<<1|1].l;
		tree[x].l1=tree[x<<1].ll;
		tree[x].r1=tree[(x<<1|1)].r1;
	}
	if(tree[x<<1|1].sum+tree[x<<1].r>=tree[x].r) {
		tree[x].r=tree[x<<1|1].sum+tree[x<<1].r;
		tree[x].l2=tree[x<<1].l2;
		tree[x].r2=tree[x<<1|1].rr;
	}
	if(tree[x<<1|1].sum>tree[x].r) {
		tree[x].r=tree[x<<1|1].sum;
		tree[x].l2=tree[x<<1|1].ll;
		tree[x].r2=tree[x<<1|1].rr;
	}
	if(tree[x<<1|1].r>tree[x].r) {
		tree[x].r=tree[x<<1|1].r;
		tree[x].l2=tree[(x<<1|1)].l2;
		tree[x].r2=tree[x<<1|1].r2;
	}
	if(tree[x<<1].mid>=tree[x].mid) {
		tree[x].mid=tree[x<<1].mid;
		tree[x].l3=tree[x<<1].l3;
		tree[x].r3=tree[x<<1].r3;
	}
	//if(tree[x<<1|1].l<0) {
	if(tree[x<<1].r>tree[x].mid) {
		tree[x].mid=tree[x<<1].r;
		tree[x].l3=tree[x<<1].l2;
		tree[x].r3=tree[x<<1].r2;
	}
	//}
	if(tree[x<<1|1].l+tree[x<<1].r>tree[x].mid) {
		tree[x].mid=tree[x<<1|1].l+tree[x<<1].r;
		tree[x].l3=tree[x<<1].l2;
		tree[x].r3=tree[x<<1|1].r1;
	}
	//if(tree[x<<1].r<0) {
	if(tree[x<<1|1].l>tree[x].mid) {
		tree[x].mid=tree[x<<1|1].l;
		tree[x].l3=tree[x<<1|1].l1;
		tree[x].r3=tree[x<<1|1].r1;
	}
	//}
	if(tree[x<<1|1].mid>tree[x].mid) {
		tree[x].mid=tree[x<<1|1].mid;
		tree[x].l3=tree[x<<1|1].l3;
		tree[x].r3=tree[x<<1|1].r3;
	}
}
void build(int i,int le,int ri) {
	if(le==ri) {
		tree[i].sum=tree[i].l=tree[i].r=tree[i].mid=a[le];
		tree[i].ll=tree[i].rr=le;
		tree[i].l1=tree[i].r1=tree[i].l2=tree[i].r2=tree[i].l3=tree[i].r3=le;
		return ;
	}
	tree[i].ll=le;
	tree[i].rr=ri;
	int mid=le+ri>>1;
	build(i<<1,le,mid);
	build(i<<1|1,mid+1,ri);
	pushup(i);
}
node query(int i,int L,int R,int l,int r) {
	if(l>r) {
		return null;
	}
	if(l<=L&&R<=r) {
		return tree[i];
	}
	int mid=L+R>>1;
	node ans1,ans2;
	if(l<=mid) {
		ans1=query(i<<1,L,mid,l,r);
	}
	if(r>mid) {
		ans2=query(i<<1|1,mid+1,R,l,r);
	}
	node ans;
	if(ans1.sum<=-2147483645&&ans2.sum<=-2147483645) {
		return ans1;
	}
	if(ans1.sum<=-2147483645) {
		return ans2;
	}
	if(ans2.sum<=-2147483645) {
		return ans1;
	}
	ans.sum=ans1.sum+ans2.sum;
	if(ans1.l>=ans.l) {
		ans.l=ans1.l;
		ans.l1=ans1.l1;
		ans.r1=ans1.r1;
	}
	if(ans1.sum>ans.l) {
		ans.l=ans1.sum;
		ans.l1=ans1.ll;
		ans.r1=ans1.rr;
	}
	if(ans1.sum+ans2.l>ans.l) {
		ans.l=ans1.sum+ans2.l;
		ans.l1=ans1.ll;
		ans.r1=ans2.r1;
	}
	if(ans2.sum+ans1.r>=ans.r) {
		ans.r=ans2.sum+ans1.r;
		ans.l2=ans1.l2;
		ans.r2=ans2.rr;
	}
	if(ans2.sum>ans.r) {
		ans.r=ans2.sum;
		ans.l2=ans2.ll;
		ans.r2=ans2.rr;
	}
	if(ans2.r>ans.r) {
		ans.r=ans2.r;
		ans.l2=ans2.l2;
		ans.r2=ans2.r2;
	}
	if(ans1.mid>=ans.mid) {
		ans.mid=ans1.mid;
		ans.l3=ans1.l3;
		ans.r3=ans1.r3;
	}
	//if(ans2.l<0) {
	if(ans1.r>ans.mid) {
		ans.mid=ans1.r;
		ans.l3=ans1.l2;
		ans.r3=ans1.r2;
	}
	//}
	if(ans2.l+ans1.r>ans.mid) {
		ans.mid=ans2.l+ans1.r;
		ans.l3=ans1.l2;
		ans.r3=ans2.r1;
	}
	//if(ans1.r<0) {
	if(ans2.l>ans.mid) {
		ans.mid=ans2.l;
		ans.l3=ans2.l1;
		ans.r3=ans2.r1;
	}
	//}
	if(ans2.mid>ans.mid) {
		ans.mid=ans2.mid;
		ans.l3=ans2.l3;
		ans.r3=ans2.r3;
	}
	ans.ll=min(ans1.ll,ans2.ll);
	ans.rr=max(ans1.rr,ans2.rr);
	return ans;
}
int Main() {
	freopen("hill.in","r",stdin);
	freopen("hill.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	for(int i=1,a,b; i<=m; i++) {
		scanf("%d%d",&a,&b);
		node ans=query(1,1,n,a,b);
		if(ans.l>=ans.sum&&ans.l>=ans.r&&ans.l>=ans.mid) {
			printf("%d %d %d\n",ans.l1,ans.r1,ans.l);
			continue;
		}
		if(ans.sum>=ans.l&&ans.sum>=ans.r&&ans.sum>=ans.mid) {
			printf("%d %d %d\n",ans.ll,ans.rr,ans.sum);
			continue;
		}
		if(ans.mid>=ans.sum&&ans.mid>=ans.l&&ans.mid>=ans.r) {
			printf("%d %d %d\n",ans.l3,ans.r3,ans.mid);
			continue;
		}
		if(ans.r>=ans.sum&&ans.r>=ans.l&&ans.r>=ans.mid) {
			printf("%d %d %d\n",ans.l2,ans.r2,ans.r);
			continue;
		}
		//cout<<ans.l<<" "<<ans.sum<<" "<<ans.r<<" "<<ans.mid<<endl;
	}
	//print(1);
	return 0;
}
int heh=Main();
int main() {
	;
}