记录编号 38446 评测结果 AAAAAAAA
题目名称 山海经 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 4.712 s
提交时间 2012-04-18 22:13:56 内存使用 0.65 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,m,w[100001];
inline int Max(int a,int b) {return a>b?a:b;} 
inline int Max(int a,int b,int c) {return Max(Max(a,b),Max(b,c));}
struct tree
{
	tree *lchild;
	tree *rchild;
	int l,r,sum;
	int lmax,rmax;
	int lm,rm;
	int zmax,zl,zr;
};

void *build(tree *tmp,int ll,int rr)
{
	tmp->l=ll;
	tmp->r=rr;
	tmp->lchild=NULL;
	tmp->rchild=NULL;
	if (ll==rr)
	{
		tmp->lmax=w[ll];
		tmp->rmax=w[ll];
		tmp->lm=ll;
		tmp->rm=rr;
		tmp->zmax=w[ll];
		tmp->zl=ll;
		tmp->zr=ll;
		tmp->sum=w[ll];
		return tmp;
	}
	if (ll<rr)
	{
		int mid;
		mid=(ll+rr)>>1;
		tmp->lchild=new tree;
		tmp->rchild=new tree;
		build(tmp->lchild,ll,mid);
		build(tmp->rchild,mid+1,rr);
		tree *lc=new tree;
		tree *rc=new tree;
		lc=tmp->lchild;
		rc=tmp->rchild;
		
		tmp->sum=lc->sum+rc->sum;
		tmp->zmax=Max(lc->zmax,rc->zmax,rc->lmax+lc->rmax);
		tmp->lmax=Max(lc->lmax,lc->sum+rc->lmax);
		tmp->rmax=Max(rc->rmax,rc->sum+lc->rmax);
		if(tmp->zmax==lc->zmax) {tmp->zl=lc->zl;  tmp->zr=lc->zr;}  
		else if(tmp->zmax==rc->lmax+lc->rmax) {tmp->zl=lc->rm; tmp->zr=rc->lm;}
		else if(tmp->zmax==rc->zmax) {tmp->zl=rc->zl;  tmp->zr=rc->zr;}
		
		if(tmp->lmax==lc->lmax) tmp->lm=lc->lm; else tmp->lm=rc->lm;
		if(tmp->rmax==rc->rmax) tmp->rm=rc->rm; else tmp->rm=lc->rm;
		tmp->sum=lc->sum+rc->sum;
	}
}

tree work(tree *tmp,int ll,int rr)
{
	if (tmp->l==ll&&tmp->r==rr)
	{
		tree ans;
		ans.sum=tmp->sum;
		ans.lmax=tmp->lmax;
		ans.rmax=tmp->rmax;
		ans.zmax=tmp->zmax;
		ans.zl=tmp->zl;
		ans.zr=tmp->zr;
		ans.lm=tmp->lm;
		ans.rm=tmp->rm;
		return ans;
	}
	tree ans;
	int mid;
	mid=(tmp->l+tmp->r)>>1;
	if (rr<=mid)
	{
		ans=work(tmp->lchild,ll,rr);
		return ans;
	}
	if (ll>mid)
	{
		ans=work(tmp->rchild,ll,rr);
		return ans;
	}
	tree lmid,rmid;
	lmid=work(tmp->lchild,ll,mid);
	rmid=work(tmp->rchild,mid+1,rr);
	ans.sum=lmid.sum+rmid.sum;
	ans.zmax=Max(lmid.zmax,rmid.zmax,rmid.lmax+lmid.rmax);
	ans.lmax=Max(lmid.lmax,lmid.sum+rmid.lmax);
	ans.rmax=Max(rmid.rmax,rmid.sum+lmid.rmax);
	
	if(ans.zmax==lmid.zmax) {ans.zl=lmid.zl;  ans.zr=lmid.zr;}  
	else if(ans.zmax==rmid.lmax+lmid.rmax) {ans.zl=lmid.rm; ans.zr=rmid.lm;}
	else if(ans.zmax==rmid.zmax) {ans.zl=rmid.zl;  ans.zr=rmid.zr;}
	if(ans.lmax==lmid.lmax) ans.lm=lmid.lm; else ans.lm=rmid.lm;
	if(ans.rmax==rmid.rmax) ans.rm=rmid.rm; else ans.rm=lmid.rm;
	return ans;
}
int main()
{
	freopen ("hill.in","r",stdin);
	freopen ("hill.out","w",stdout);
	cin>>n>>m;
	for (int i=1;i<=n;i++)
		cin>>w[i];
	tree *root=new tree;
	build(root,1,n);
	tree ans;
	for (int i=0;i<m;i++)
	{
		int a,b;
		cin>>a>>b;
		ans=work(root,a,b);
		cout<<ans.zl<<' '<<ans.zr<<' '<<ans.zmax<<endl;
	}
	return 0;
}