此题也算技巧提吧!dp预处理将
1 #include <stdio.h> 2 #include <math.h> 3 4 int dpmax[50010][20],dpmin[50010][20],n,a[50010]; 5 int max (int x,int y) 6 { 7 return x>y?x:y; 8 } 9 int min (int x,int y) 10 { 11 return x<y?x:y; 12 } 13 void init () 14 { 15 int i,j; 16 for(i=1;i<=n;i++) 17 { 18 dpmax[i][0]=a[i]; 19 dpmin[i][0]=a[i]; 20 } 21 for(j=1;j<=log((double)(n+1))/log(2.0);j++) 22 for(i=1;i+((1<<j)-1)<=n;i++) 23 { 24 dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<j-1)][j-1]); 25 dpmin[i][j]=min(dpmin[i][j-1],dpmin[i+(1<<j-1)][j-1]); 26 } 27 } 28 int getmax( int a , int b ){ 29 int k = (int)(log((double)(b-a+1))/log(2.0)); 30 return max( dpmax[a][k] , dpmax[b-(1<<k)+1][k] ); 31 } 32 int getmin( int a , int b ){ 33 int k = (int)(log((double)(b-a+1))/log(2.0)); 34 return min( dpmin[a][k] , dpmin[b-(1<<k)+1][k] ); 35 } 36 int main () 37 { 38 int m,i,j; 39 while(scanf("%d%d",&n,&m)!=EOF) 40 { 41 for(i=1;i<=n;i++) 42 scanf("%d",&a[i]); 43 init(); 44 while(m--) 45 { 46 int a,b; 47 scanf("%d%d",&a,&b); 48 printf("%d ",getmax(a,b)-getmin(a,b)); 49 } 50 } 51 }