题意:求区间最值
思路:线段树,树状数组,RMQ。。。这里是树状数组写法
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; typedef long long LL; const int maxn=2e5+5; int lowbit(int x) { return x&(-x); } int c[maxn],c1[maxn],v[maxn],v1[maxn]; int n,m; void add(int k,int num) { v[k]=num; v1[k]=num; while(k<=n) { c[k]=max(c[k],num); c1[k]=min(c1[k],num); k+=lowbit(k); } } int A_B(int x,int y) { int ans=v[y]; while(x!=y){ for(y-=1;y-(y&-y)>=x;y-=lowbit(y)) { ans=max(ans,c[y]); } ans=max(ans,v[y]); } return ans; } int A_B1(int x,int y) { int ans=v1[y]; while(x!=y){ for(y-=1;y-(y&-y)>=x;y-=lowbit(y)) { ans=min(ans,c1[y]); } ans=min(ans,v1[y]); } return ans; } int main() { int a,b; while(scanf("%d%d",&n,&m) != EOF) { memset(c,0,sizeof(c)); memset(c1,0x3f,sizeof(c1)); memset(v,0,sizeof(v)); memset(v1,0,sizeof(v1)); for(int i=1;i<=n;i++) { scanf("%d",&v[i]); add(i,v[i]); } for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); int aa=A_B(a,b); int bb=A_B1(a,b); printf("%d\n",abs(aa-bb)); } } }