【模板】RMQ问题的ST解决
【模板】
#include<iostream> #include<cstdio> #include<cmath> using namespace std; const int N = 1e6+10; int n, q, f[N][30]; inline int read() { int x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();} while (isdigit(ch)){x=x*10+ch-48;ch=getchar();} return x*f; } void in() { n = read(); q = read(); for(int i = 1; i <= n; i++) f[i][0] = read(); } void init() { for(int j = 1; (1<<j) <= n; j++)//(1<<j是长度) for(int i = 1; i+(1<<j)-1 <= n; i++) f[i][j] = max(f[i][j-1], f[i+(1<<(j-1))][j-1]); } int query(int l, int r) { int len = log2(r-l+1); return max(f[l][len], f[r-(1<<len)+1][len]); } void solve() { int l, r; while(q--) { l = read(); r = read(); printf("%d\n", query(l, r)); } } int main() { in(); init(); solve(); return 0; }

浙公网安备 33010602011771号