第三题的: #include<bits/stdc++.h> using namespace std; const int N=1e5+5,M=20; int n,m; int a[N]; int maxf[N][M]; int minf[N][M]; int querymax(int l,int r) { int len=r-l+1; int k=(log(len)/log(2)); return max(maxf[l][k],maxf[r-(1<<k)+1][k]); } int querymin(int l,int r) { int len=r-l+1; int k=(log(len)/log(2)); return min(minf[l][k],minf[r-(1<<k)+1][k]); } int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int j=0;j<M;j++){ for(int i=1;i+(1<<j)-1<=n;i++) { if(j==0) maxf[i][j]=a[i]; else{ maxf[i][j]=max(maxf[i][j-1],maxf[i+(1<<(j-1))][j-1]); } } } for(int j=0;j<M;j++){ for(int i=1;i+(1<<j)-1<=n;i++) { if(j==0) minf[i][j]=a[i]; else{ minf[i][j]=min(minf[i][j-1],minf[i+(1<<(j-1))][j-1]); } } } while(m--){ int x,y;cin>>x>>y; cout<<querymax(x,y)-querymin(x,y)<<endl; } return 0; }