记录编号 |
393669 |
评测结果 |
AAAAAAAAAAAAAAAAAA |
题目名称 |
[USACO Jan07] 均衡队形 |
最终得分 |
100 |
用户昵称 |
Hyoi_ctime |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.414 s |
提交时间 |
2017-04-11 20:42:28 |
内存使用 |
30.80 MiB |
显示代码纯文本
#include<cstdio>
using namespace std;
int N=0,Q=0;
int A[200003][20]={0},B[200003][20]={0};
int min(int x,int y){
if(x<=y) return x;
return y;
}
int max(int x,int y){
if(x<=y) return y;
return x;
}
int RMQ1(int l,int r){
int k=0;
while(( 1<<(k+1) )<=r-l+1) k++;
return min(A[l][k],A[r-(1<<k)+1][k]);
}
int RMQ2(int l,int r){
int k=0;
while(( 1<<(k+1) )<=r-l+1) k++;
return max(B[l][k],B[r-(1<<k)+1][k]);
}
int main(){
freopen("lineup.in","r",stdin);
freopen("lineup.out","w",stdout);
scanf("%d%d",&N,&Q);
for(int i=1;i<=N;++i){
scanf("%d",&A[i][0]);
B[i][0]=A[i][0];
}
for(int j=1;(1<<j)<=N;++j){
for(int i=1;i+(1<<j)-1<=N;++i){
A[i][j]=min(A[i][j-1],A[i+(1<<(j-1))][j-1]);
}
}
for(int j=1;(1<<j)<=N;++j){
for(int i=1;i+(1<<j)-1<=N;++i){
B[i][j]=max(B[i][j-1],B[i+(1<<(j-1))][j-1]);
}
}
int l=0,r=0,t1=0,t2=0;
for(int i=1;i<=Q;++i){
scanf("%d%d",&l,&r);
if(l>r){
int temp=l;
l=r;
r=temp;
}
t1=RMQ1(l,r);
t2=RMQ2(l,r);
printf("%d\n",t2-t1);
}
return 0;
}