这题可以看成是“集训每日一题0711”的简化版,没有修改操作,只需查询最小和最大的。
View Code
#include <stdio.h> #define MIN(a,b) ((a)<(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b)) #define INF 0x7fffffff #define N 50001 int n,m,D; int min[4*N],max[4*N]; void init() { int i,t; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) { min[i]=INF; max[i]=0; } for(i=1;i<=n;i++) { scanf("%d",&t); min[i+D]=max[i+D]=t; } for(i=D-1;i^1;i--) { min[i]=MIN(min[i<<1],min[i<<1|1]); max[i]=MAX(max[i<<1],max[i<<1|1]); } } int getmin(int x,int y) { int i=x+D-1,j=y+D+1,ret=INF; for(;i^j^1;i>>=1,j>>=1) { if(~i&1) ret=MIN(ret,min[i^1]); if(j&1) ret=MIN(ret,min[j^1]); } return ret; } int getmax(int x,int y) { int i=x+D-1,j=y+D+1,ret=0; for(;i^j^1;i>>=1,j>>=1) { if(~i&1) ret=MAX(ret,max[i^1]); if(j&1) ret=MAX(ret,max[j^1]); } return ret; } int main() { int i,a,b; while(~scanf("%d%d",&n,&m)) { init(); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); printf("%d\n",getmax(a,b)-getmin(a,b)); } } return 0; }