比赛 20120418s 评测结果 C
题目名称 山海经 最终得分 0
用户昵称 TBK 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-18 11:29:43
显示代码纯文本
#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <cmath> 
#include <cstring> 
#include <string> 
#include <iomanip> 
#include <vector> 
#include <set> 
#include <algorithm> 
#define MAXN 0x7fffffff 
using namespace std; 
int a[100001],b,c,d,x,y,s,s1,s2,s3,s4,s5;
struct fun
{
	int l;
	int r;
	int m;
	int n;
	int k;
	int i;
	int j;
	int e;
	int g,g1,g2;
	int h,h1,h2;
}f[300000];
bool bo;
void build(int p,int q)
{
	int t;
	t=d;
	f[d].l=p;
	f[d].r=q;
	if (p==q)
	{
		f[d].e=a[p];
		f[d].k=a[p];
		f[d].g=a[p];
		f[d].g1=p;
		f[d].g2=p;
		f[d].h=a[p];
		f[d].h1=p;
		f[d].h2=p;
		f[d].i=p;
		f[d].j=q;
		return;
	}
	d++;
	f[t].m=d;
	build(p,(p+q)/2);
	d++;
	f[t].n=d;
	build((p+q)/2+1,q);
	f[t].e=f[f[t].m].e+f[f[t].n].e;
	if (f[f[t].m].k>=f[f[t].n].k)
	{
		f[t].k=f[f[t].m].k;
		f[t].i=f[f[t].m].i;
		f[t].j=f[f[t].m].j;	
	}
		else 
		{
			f[t].k=f[f[t].n].k;
			f[t].i=f[f[t].n].i;
			f[t].j=f[f[t].n].j;	
		}
	if (f[f[t].m].g>f[f[t].m].e+f[f[t].n].g)
	{
		f[t].g=f[f[t].m].g;
		f[t].g1=f[f[t].m].g1;
		f[t].g2=f[f[t].m].g2;
	}
		else 
		{
			f[t].g=f[f[t].m].e+f[f[t].n].g;
			f[t].g1=f[t].l;
			f[t].g2=f[f[t].n].g2;
		}
	if (f[f[t].n].h>f[f[t].n].e+f[f[t].m].h)
	{
		f[t].h=f[f[t].n].h;
		f[t].h1=f[f[t].n].h1;
		f[t].h2=f[f[t].n].h2;
	}
		else 
		{
			f[t].h=f[f[t].n].e+f[f[t].m].h;
			f[t].h1=f[f[t].m].h1;
			f[t].h2=f[t].r;
		}
	if (f[f[t].m].h+f[f[t].n].g>f[t].k) 
	{
		f[t].k=f[f[t].m].h+f[f[t].n].g;
		f[t].i=f[f[t].m].h1;
		f[t].j=f[f[t].n].g2;
	}
		else if ((f[f[t].m].h+f[f[t].n].g==f[t].k)&&(f[t].i>f[f[t].m].h1))
		{			
			f[t].i=f[f[t].m].h1;
			f[t].j=f[f[t].n].g2;
		}
}

void find(int u)
{
	if ((f[u].l==x)&&(f[u].r==y))
	{
		printf("%d %d %d\n",f[u].k,f[u].i,f[u].j);
		return;
	}
		else if ((x<=f[f[u].m].r)&&(y>=f[f[u].n].l))
		{
			find1(f[u].m);
			if (s<0) 
			{
				s=0;
				bo=true;
				s1=f[f[u].n].l;
			}
			find2(f[u].n);
			printf("%d %d %d\n",s,s1,s2);
		}
			else 
			{
				if (y>=f[f[u].n].l) find(f[u].n);
					else find(f[u].m);
			}
}
int main(void) 
{ 
    freopen("hill.in","r",stdin); 
    freopen("hill.out","w",stdout); 
    scanf("%d%d",&b,&c);
	for (d=1;d<=b;d++) scanf("%d",&a[d]);
	d=0;
	build(1,b);
	for (d=0;d<c;d++)
	{
		scanf("%d%d",&x,&y);
		s=0;
		bo=false;
		find(0);
	}
    fclose(stdin); 
    fclose(stdout); 
    return 0; 
}