Topic meaning:
A farmer has N cows, each of which has a different height, we need to find the height difference between the highest and the lowest cows.
Solution: Use RMQ, if you don't know RMQ, you can read what this person wrote and click to open the link
Recursive:
#include<iostream> #include<algorithm> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int ma[500005]; int mi [500005]; void build(int l, int r, int rt) { if (l == r) { cin >> ma [rt]; mi[rt] = ma[rt]; return; } int m = (l + r) >> 1; build(lson); build(rson); ma[rt] = max(ma[rt << 1], ma[rt << 1 | 1]); mi[rt] = min(mi[rt << 1], mi[rt << 1 | 1]); } int rmq_max(int L, int R, int l, int r, int rt) { if (L <= l && R >= r) return ma[rt]; int m = (r + l) >> 1; int ret = 0; if (L <= m) ret = max(ret, rmq_max(L, R, lson)); else if (R > m) ret = max (ret, rmq_max (L, R, rson)); return ret; } int rmq_min (int L, int R, int l, int r, int rt) { if (L <= l && R >= r) return mi[rt]; int m = (r + l) >> 1; int ret = 100005; if (L <= m) ret = min (ret, rmq_min (L, R, lson)); else if (R > m) ret = min (ret, rmq_min (L, R, rson)); return ret; } intmain() { int n, m, s, e; cin >> n >> m; build(1, n, 1); for (int i = 1; i <= m; i++) { cin >> s >> e; cout << rmq_max(s, e, 1, n, 1) - rmq_min(s, e, 1, n, 1) << endl; } return 0; }
Non-recursive:
#include <iostream> #include <algorithm> #include <cmath> const int INF=0x3f3f3f3f; #define LL long long const int maxn=80000; const int maxm=30; int dp_min [maxn] [maxm], dp_max [maxn] [maxm], a [maxn]; int n; void rmq_init() { for(int i=1;i<=n;i++) { dp_min[i][0]=a[i]; dp_max[i][0]=a[i]; } for(int j=1;(1<<j)<=n;j++) { for(int i=1;i+(1<<j)-1<=n;i++) { dp_min[i][j]=min(dp_min[i][j-1],dp_min[i+(1<<(j-1))][j-1]); dp_max[i][j]=max(dp_max[i][j-1],dp_max[i+(1<<(j-1))][j-1]); } } } int rmq_min (int l, int r) { int k=0; while((1<<(k+1))<=r-l+1) k++; return min(dp_min[l][k],dp_min[r-(1<<k)+1][k]); } int rmq_max(int l,int r) { int k=0; while((1<<(k+1))<=r-l+1) k++; return max(dp_max[l][k],dp_max[r-(1<<k)+1][k]); } intmain() { int q,l,r; while(~scanf("%d%d",&n,&q)) { for(int i=1;i<=n;i++) cin("%d",&a[i]); rmq_init(); while(q--) { cin("%d%d",&l,&r); printf("%d\n",rmq_max(l,r)-rmq_min(l,r)); } } return 0; }