RMQ
感觉线段树 也就那样儿
#include <bits/stdc++.h> using namespace std; const int maxn = 10010; int s[maxn<<2]; void up(int rt){ s[rt] = max(s[rt<<1] , s[rt<<1|1]); } void build(int l,int r,int rt){ if(l == r){ scanf("%d",&s[rt]); return ; } int mid = (l + r)/2; build(l, mid, rt<<1); build(mid+1, r, rt<<1|1); up(rt); } void add(int i,int j,int l,int r,int rt){ // 对第i位变成j 这个add函数没验证 if(l == r){ s[rt] = j; return ; } int mid = (l + r)/2; if(i <= mid) add(i,j,l,mid,rt<<1); if(i > mid)//或者用else 也可以 因为只是i和mid的判断 add(i,j,mid+1,r,rt<<1|1); up(rt); } int query(int L,int R,int l,int r,int rt){ if(L <= l && r <= R){ return s[rt]; } int ans = 0; int mid = (l + r)/2; if(L <= mid) ans = max(ans, query(L,R,l,mid,rt<<1)); if(R > mid) ans = max(ans,query(L,R,mid+1,r,rt<<1|1)); return ans; } int main (){ int n,m; scanf("%d", &n); build(1,n,1); scanf("%d", &m); for(int i=1; i <= m;i++){ int l,r; scanf("%d %d",&l,&r); printf("%d " , query(l+1,r+1,1,n,1)); } return 0; }
等待是最好的成长。