记录编号 159554 评测结果 AAAAAAAA
题目名称 山海经 最终得分 100
用户昵称 Gravatarggwdwsbs 是否通过 通过
代码语言 C++ 运行时间 1.143 s
提交时间 2015-04-21 20:21:04 内存使用 22.04 MiB
显示代码纯文本
#include<stdio.h>
#include<cstring>
const int maxn=100010;
const int INF=2147483600;
struct qj
{
	int l,r,w;
};
struct tree
{
	int left,right;
	qj sum,smx,lmx,rmx;
}a[maxn*4];
int b[maxn];
int n,m,l,r;
tree zero=(tree){0,0,{INF,INF,0},{INF,INF,0},{INF,INF,0},{INF,INF,0}};
bool empty(qj a)
{
	return a.l==INF;
}
inline qj operator + (qj a,qj b)
{
	if(empty(b)) return a;
	if(empty(a)) return b;
	qj c;
	c.l=a.l;
	c.r=b.r;
	c.w=b.w+a.w;
	return c;
}
inline bool operator > (qj a,qj b)
{
	if(a.w!=b.w) return a.w>b.w;
	if(a.l!=b.l) return a.l<b.l;
	else return a.r<b.r;
}
qj max(qj x,qj y)
{
	if(x>y) return x;
	else return y;
}
inline tree operator + (tree a,tree b)
{
	if(empty(b.sum)) return a;
	if(empty(a.sum)) return b;
	tree c;
	c.sum=a.sum+b.sum;
	c.lmx=max(a.lmx,a.sum+b.lmx);
	c.rmx=max(b.rmx,a.rmx+b.sum);
	c.smx=max(a.smx,b.smx);
	if(!empty(a.rmx)||!empty(b.lmx))
	 c.smx=max(c.smx,a.rmx+b.lmx);
	return c;
}

int give(int k,int l)
{
	qj c;
	c.l=c.r=l;
	c.w=b[l];
	a[k].sum=c;
	a[k].smx=c;
	if(c.w>0) a[k].lmx=c;
	else a[k].lmx=zero.sum;
	if(c.w>=0) a[k].rmx=c;
	else a[k].rmx=zero.sum;
}

int build(int k,int l,int r)
{
	if(l==r) give(k,l);
	else
	{
		build(2*k,l,(l+r)/2);
		build(2*k+1,(l+r)/2+1,r);
		a[k]=a[2*k]+a[2*k+1];
	}
	a[k].left=l;
	a[k].right=r;
}
tree query(int k,int l,int r)
{
	if(l>a[k].right||a[k].left>r) return zero;
	if(l<=a[k].left&&a[k].right<=r) return a[k];
	return query(2*k,l,r)+query(2*k+1,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",&b[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&l,&r);
		tree c=query(1,l,r);
		printf("%d %d %d\n",c.smx.l,c.smx.r,c.smx.w);
	}
}