比赛 Segment Tree Competition 评测结果 AAAAAAAATT
题目名称 延绵的山峰 最终得分 80
用户昵称 Twist Fate 运行时间 2.059 s
代码语言 C++ 内存使用 1.29 MiB
提交时间 2016-08-28 19:42:41
显示代码纯文本
//动态规划  fmin[i]表示前i个的最小值 
//fmax[i]表示前i个的最大值 
#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct{
	int num,w;
}zhen;
int a[100005];
zhen f[100005];
int search(int c,int b){
	int ans=-1;
	for(int i=c;i<=b;i++){
		ans=max(ans,a[i]);
	}
	return ans;
}
int main(){
	freopen("climb.in","r",stdin);
	freopen("climb.out","w",stdout);
	int n;
	scanf("%d",&n);
	int ma=0,mi=0;
	scanf("%d",&a[0]);
	f[0].num=a[0];
	f[0].w=0;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(a[i]>=f[i-1].num){
			f[i].num=a[i];
			f[i].w=i;
		}
		else{
			f[i].num=f[i-1].num;
			f[i].w=f[i-1].w;
		}
	}
	int m;
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
			int b,c;
			scanf("%d%d",&b,&c);
			if(b==0){
				printf("%d\n",f[c].num);
				continue;
			}
			if(b==c){
				printf("%d\n",a[b]);
				continue;
			}
			if(f[b].num!=f[c].num){
				printf("%d\n",f[c].num);
				continue;
			}
			if(f[b].num==f[c].num&&f[c].w>=b){
				printf("%d\n",f[c].num);
				continue;
			}
			if(f[b].num==f[c].num&&f[c].w<b){
				printf("%d\n",search(b,c));
				continue;
			}
	}
	return 0;
}