题意:线段树水题,区间取最大值最小值即可,不用更新,直接跑;
#include<algorithm> #include<iostream> #include<queue> #include<map> #include<set> #include<vector> #include<stack> #define N 50005 #define INF 0x3f3f3f3f using namespace std; typedef struct node{ int x;int y;int M;int m; }node; node a[N*4]; int b[N]; void built(int root,int first,int end){ if(first==end){ a[root].x=first;a[root].y=end;a[root].m=b[first];a[root].M=b[first]; return ; } int mid=(first+end)/2; built(root*2,first,mid); built(root*2+1,mid+1,end); a[root].x=a[root*2].x;a[root].y=a[root*2+1].y;a[root].m=min(a[root*2].m,a[root*2+1].m); a[root].M=max(a[root*2].M,a[root*2+1].M); } int sum,ans; void U(int root,int first,int end,int l,int r){ if(l<=first&&end<=r){ sum=min(sum,a[root].m); ans=max(ans,a[root].M); return ; } int mid=(first+end)/2; if(l<=mid) U(root*2,first,mid,l,r); if(r>mid) U(root*2+1,mid+1,end,l,r); } int main(){ int n,q; scanf("%d %d",&n,&q); for(int i=1;i<=n;i++){ scanf("%d",&b[i]); } built(1,1,n); int c,d; for(int i=1;i<=q;i++){ scanf("%d %d",&c,&d); sum=INF; ans=-INF; U(1,1,n,c,d); printf("%d ",ans-sum); } return 0; }