比赛 |
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;
}