RMQ(快速查詢區間最值)
阿新 • • 發佈:2019-02-14
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #include <math.h> #define ll long long using namespace std; const int maxn=5e4+10; int maxnum[maxn][20]; int minnum[maxn][20]; void RMQ(int num) { for(int j=1;j<20;j++) { for(int i=1;i<=num;i++) { if(i+(1<<j)-1<=num) { maxnum[i][j]=max(maxnum[i][j-1],maxnum[i+(1<<(j-1))][j-1]); minnum[i][j]=min(minnum[i][j-1],minnum[i+(1<<(j-1))][j-1]); } } } } int n,m,st,en; int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) { scanf("%d",&maxnum[i][0]); minnum[i][0]=maxnum[i][0]; } RMQ(n); while(m--) { scanf("%d%d",&st,&en); int k=(int)((log(en-st+1))/log(2.0)); int max1,min1; max1=max(maxnum[st][k],maxnum[en-(1<<k)+1][k]); min1=min(minnum[st][k],minnum[en-(1<<k)+1][k]); printf("%d\n",max1-min1); } } }