记录编号 122137 评测结果 AAAAAAAAAAAAAAAAAA
题目名称 [USACO Jan07] 均衡队形 最终得分 100
用户昵称 GravatarJSX 是否通过 通过
代码语言 C++ 运行时间 0.761 s
提交时间 2014-09-22 17:01:40 内存使用 29.10 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 i=1;i<=N;++i){
		for(int j=1;(1<<j)<=N;++j){
			printf("%4d",A[i][j]);
		}
		printf("\n");
	}*/
	
	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]);
		}
	}
	
	/*for(int i=1;i<=N;++i){
		for(int j=1;(1<<j)<=N;++j){
			printf("%4d",B[i][j]);
		}
		printf("\n");
	}*/
	
	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;
}