记录编号 | 393669 | 评测结果 | AAAAAAAAAAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [USACO Jan07] 均衡队形 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | 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; }