简单题,求一定范围内的最大数于最小数之差,用两个数组保存max和min就行了。
1 #include <stdio.h> 2 #include <string.h> 3 #define N 50005 4 #define INF 0x7fffffff 5 int max[4*N],min[4*N]; 6 int D; 7 int Max(int a,int b) 8 { 9 return a>b ?a :b; 10 } 11 int Min(int a,int b) 12 { 13 return a<b ?a :b; 14 } 15 int query(int a,int b) 16 { 17 int i=D+a-1, j=D+b+1; 18 int mi=INF,ma=-INF; 19 for(; i+1 != j; i>>=1, j>>=1) 20 { 21 if(~i & 1) 22 mi = Min(mi,min[i^1]), 23 ma = Max(ma,max[i^1]); 24 if(j & 1) 25 mi = Min(mi,min[j^1]), 26 ma = Max(ma,max[j^1]); 27 } 28 return ma-mi; 29 } 30 int main() 31 { 32 int m,n,i,x,y; 33 while(~scanf("%d%d",&n,&m)) 34 { 35 for(D = 1; D < n+2; D <<= 1); 36 memset(max,0xc3,sizeof(int)*2*D); 37 memset(min,0x3f,sizeof(int)*2*D); 38 for(i = 1; i <= n; i++) 39 { 40 scanf("%d",&max[D+i]); 41 min[D+i] = max[D+i]; 42 } 43 for(i = D-1; i; i--) 44 { 45 max[i] = Max(max[i<<1],max[i<<1|1]); 46 min[i] = Min(min[i<<1],min[i<<1|1]); 47 } 48 while(m--) 49 { 50 scanf("%d%d",&x,&y); 51 printf("%d\n",query(x,y)); 52 } 53 } 54 return 0; 55 }