比赛 20150421 评测结果 MMMMMMMM
题目名称 山海经 最终得分 0
用户昵称 ggwdwsbs 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2015-04-21 11:58:07
显示代码纯文本
#include<stdio.h>
const int maxn=1e6;
const int INF=2147483600;
struct aa
{
	long long w;
	int num;
};
int n,m,l,r;
aa a[maxn];
aa d[maxn][40];
aa d1[maxn][40];
aa max(aa x,aa y)
{
	if(x.w>y.w) return x;
	else return y;
}
aa min(aa x,aa y)
{
	if(x.w>y.w) return y;
	else return x; 
}
int built_max()
{
	for(int i=0;i<n;i++)
	 d1[i][0]=a[i];
	for(int j=1;(1<<j)<=n;j++)
	 for(int i=0;i+(1<<j)-1<n;i++)
	  d1[i][j]=max(d1[i][j-1],d1[i+(1<<(j-1))][j-1]); 
}
aa query_max(int l,int r)
{
	int k=0;
	while(1<<(k+1)<=r-l+1) k++;
	return max(d1[l][k],d1[r-(1<<k)+1][k]);
}
int built_min()
{
	for(int i=0;i<n;i++)
	 d[i][0]=a[i];
	for(int j=1;(1<<j)<=n;j++)
	 for(int i=0;i+(1<<j)-1<n;i++)
	  d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]); 
}
aa query_min(int l,int r)
{
	int k=0;
	while(1<<(k+1)<=r-l+1) k++;
	return min(d[l][k],d[r-(1<<k)+1][k]);
}
int main()
{
	freopen("hill.in","r",stdin);
	freopen("hill.out","w",stdout);
	scanf("%d%d",&n,&m);
	long long ans=0;
	for(int i=0;i<n;i++)
	{
		int x;
		scanf("%d",&x);
		ans+=x;
		a[i].w=ans;
		a[i].num=i;
	}
	long long time=m*n*n;
	if(time>(1e9)*5)
	{
		built_min();
		built_max();
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d",&l,&r);
			aa x=query_min(l-1,r-1);
			aa y=query_max(l-1,r-1);
			if(l-2>=0)
			x.w-=a[l-2].w;
			if(l-2>=0)
			y.w-=a[l-2].w;
			if(y.num>x.num&&x.w<0) y.w-=x.w,x.num++;
			if(y.num<x.num) x.num=l-1;
			printf("%d %d %d\n",x.num+1,y.num+1,y.w);
		}
		return 0;
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&l,&r);
		l--,r--;
		int x,y,maxx=-INF;
		for(int j=l;j<=r;j++)
		 for(int k=l-1;k<j;k++)
		 {
			int ret=a[j].w-a[k].w;
			if(maxx<ret) 
			{
				maxx=ret;
				x=j;
				y=k;
			}
		 }
		printf("%d %d %d\n",y+2,x+1,maxx); 
	} 
}