比赛 20120418s 评测结果 AAAAAAEE
题目名称 山海经 最终得分 75
用户昵称 kaaala 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-18 09:52:30
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>

using namespace std;

struct Node
{
	int l,r,mxx,ll,lr,rl,rr,sum,lt,rt,lmx,rmx;
}Tree[200020];

int val[100010],N,M;

inline void updata(int p)
{
	int pl=2*p,pr=pl+1;
	Tree[p].sum=Tree[pl].sum+Tree[pr].sum;
	Tree[p].mxx=Tree[pl].mxx;
	Tree[p].l=Tree[pl].l;
	Tree[p].r=Tree[pl].r;
	if(Tree[p].mxx<(Tree[pl].rmx+Tree[pr].lmx))
	{
		Tree[p].l=Tree[pl].rl;
		Tree[p].r=Tree[pr].lr;
		Tree[p].mxx =Tree[pl].rmx+Tree[pr].lmx;
    }
	if(Tree[p].mxx<Tree[pr].mxx)
	{
		Tree[p].l=Tree[pr].l;
		Tree[p].r=Tree[pr].r;
		Tree[p].mxx=Tree[pr].mxx;
	}
	Tree[p].lmx=Tree[pl].sum+Tree[pr].lmx;
	Tree[p].ll=Tree[pl].lt;
	Tree[p].lr=Tree[pr].lr;
	if(Tree[p].lmx<Tree[pl].lmx)
	{
		Tree[p].ll=Tree[pl].ll;
		Tree[p].lr=Tree[pl].lr;
		Tree[p].lmx=Tree[pl].lmx;
	}
	Tree[p].rmx=Tree[pr].sum+Tree[pl].rmx;
	Tree[p].rl=Tree[pl].rl;
	Tree[p].rr=Tree[pr].rt;
	if(Tree[p].rmx<Tree[pr].rmx)
	{
		Tree[p].rl=Tree[pr].rl;
		Tree[p].rr=Tree[pr].rr;
		Tree[p].rmx=Tree[pr].rmx;
	}
}

void Build(int p,int l,int r)
{
	Tree[p].lt=l;
	Tree[p].rt=r;
	if(l==r)
	{
		Tree[p].sum=Tree[p].mxx=Tree[p].lmx=Tree[p].rmx=val[l];
		Tree[p].l=Tree[p].r=Tree[p].rl=Tree[p].rr=Tree[p].ll=Tree[p].lr=l;
	}
	else
	{
		int mid=(l+r)>>1;
		Build(2*p,l,mid);
		Build(2*p+1,mid+1,r);
		updata(p);
	}
}

inline Node combine(const Node &n1,const Node &n2)
{
	Node n;
	n.sum=n1.sum+n2.sum;
	n.mxx=n1.mxx;
	n.l=n1.l;
	n.r=n1.r;
	if(n.mxx<(n1.rmx+n2.lmx))
	{
		n.l=n1.rl;
		n.r=n2.lr;
		n.mxx=n1.rmx+n2.lmx;
	}
	if(n.mxx<n2.mxx)
	{
		n.l=n2.l;
		n.r=n2.r;
		n.mxx=n2.mxx;
	}
	n.lmx=n1.sum+n2.lmx;
	n.ll=n1.lt;
	n.lr=n2.lr;
	if(n.lmx<n1.lmx)
	{
		n.ll=n1.ll;
		n.lr=n1.lr;
		n.lmx=n1.lmx;
	}
	n.rmx=n2.sum+n1.rmx;
	n.rl=n1.rl;
	n.rr=n2.rt;
	if(n.rmx<n2.rmx)
	{
		n.rl=n2.rl;
		n.rr=n2.rr;
		n.rmx=n2.rmx;
	}
	return n;
}

Node Find(int p,int l,int r)
{
	if(l==Tree[p].lt&&r==Tree[p].rt)
		return Tree[p];
	else
	{
		int pl=2*p,pr=2*p+1;
		if(l<=Tree[pl].rt&&r>=Tree[pr].lt)
		{
			Node n1=Find(pl,l,Tree[pl].rt),n2=Find(pr,Tree[pr].lt,r);
			return combine(n1,n2);
		}
		else if(l>=Tree[pr].lt)
			return Find(pr,l,r);
		else if(r<=Tree[pl].rt)
			return Find(pl,l,r);
	}
}

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",&val[i]);
	Build(1,1,N);
	for(int i=1;i<=M;i++)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		Node ans=Find(1,l,r);
		printf("%d %d %d\n",ans.l,ans.r,ans.mxx);
	}
	return 0;
}