RMQ(ST表)
阿新 • • 發佈:2019-03-20
linu math getchar() pre stream clas void inline ret
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int N, M, a[100009], l, r, st[100009][20]; inline int read() { int s=0, w=1; char ch=getchar(); while( ch<'0' || ch>'9' ){ if(ch=='-') w=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*w; } void pre() //預處理求st表 { for(register int i=1; i<=N; i++) st[i][0]=a[i]; for(int k=1; (1<<k)<=N; k++) for(register int i=1; i<=N; i++) { if(i+(1<<k)-1>N) break; st[i][k]=max(st[i][k-1], st[i+(1<<(k-1))][k-1]); } } int maxf(int l, int r) //區間劃分與求值 { if(l==r) return st[l][0]; int t=log(r-l)/log(2); //註意在Linux下log計算可能存在的潛在問題 return max(st[l][t], st[r-(1<<t)+1][t]); } int main() { N=read(), M=read(); for(register int i=1; i<=N; i++) a[i]=read(); pre(); for(register int i=1; i<=M; i++) l=read(), r=read(), printf("%d\n", maxf(l, r)); return 0; }
RMQ(ST表)