链接:点击打开链接
题意:输出序列中区间最大值和最小值的差
代码:
#include <queue> #include <vector> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int SIZE=200005; const int INF=0x3f3f3f3f; int ans_max,ans_min; int maxx[SIZE<<2],minx[SIZE<<2]; void build(int l,int r,int rt){ int m; if(l==r){ scanf("%d",&maxx[rt]); minx[rt]=maxx[rt]; return; } //建两颗树,一颗维护最大值,一颗维护最小值 m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); maxx[rt]=max(maxx[rt<<1],maxx[rt<<1|1]); minx[rt]=min(minx[rt<<1],minx[rt<<1|1]); } int query_max(int L,int R,int l,int r,int rt){ int m; if(L<=l&&r<=R) return maxx[rt]; m=(l+r)>>1; if(L<=m) ans_max=max(ans_max,query_max(L,R,l,m,rt<<1)); if(R>m) ans_max=max(ans_max,query_max(L,R,m+1,r,rt<<1|1)); return ans_max; } int query_min(int L,int R,int l,int r,int rt){ int m; if(L<=l&&r<=R) return minx[rt]; m=(l+r)>>1; if(L<=m) ans_min=min(ans_min,query_min(L,R,l,m,rt<<1)); if(R>m) ans_min=min(ans_min,query_min(L,R,m+1,r,rt<<1|1)); return ans_min; } //线段树模板 int main(){ int n,m,a,b; while(scanf("%d%d",&n,&m)!=EOF){ build(1,n,1); while(m--){ ans_max=-1*INF,ans_min=INF; scanf("%d%d",&a,&b); printf("%d\n",query_max(a,b,1,n,1)-query_min(a,b,1,n,1)); } } return 0; }