RMQ模板
代码
int rmq[maxn][20],Lg[maxn]; void GetLg() { Lg[0]=-1; for(int i=1;i<maxn;i++) Lg[i]=Lg[i-1]+(i&(i-1)?0:1); } int f(int x){ return 1<<x; } void ST(int N) { for(int i=0;i<N;i++) rmq[i][0]=A[i]; for(int j=1;f(j)<=N;j++) for(int i=0;i+f(j)-1<N;i++) rmq[i][j]=max(rmq[i][j-1],rmq[i+f(j-1)][j-1]); } int RMQ(int x,int y) { if(x>y) swap(x,y); int k=Lg[y-x+1]; return max(rmq[x][k],rmq[y-f(k)+1][k]); }