线段树,求查询区间内最小值与最大值的差 代码: #include<iostream> using namespace std; struct node { int left; int right; int min; int max; }t[500001]; int h[50005]; int a,b; int mina(int a,int b) { return a<b?a:b; } int maxa(int a,int b) { return a>b?a:b; } void build(int l,int r,int n) { if(l==r) { t[n].left=t[n].right=l; t[n].min=t[n].max=h[l]; return; } t[n].left=l; t[n].right=r; //t[n].max=-1; //t[n].min=0x3f3f3f3f; int mid=(l+r)>>1; build(l,mid,n*2); build(mid+1,r,n*2+1); t[n].min=mina(t[n*2].min,t[n*2+1].min); t[n].max=maxa(t[n*2].max,t[n*2+1].max); } void query(int n,int l,int r) { if(t[n].left==l&&t[n].right==r) { a=mina(a,t[n].min); b=maxa(b,t[n].max); return; } int mid=(t[n].left+t[n].right)>>1; if(mid>=r) { query(n*2,l,r); } else if(mid<l) { query(n*2+1,l,r); } else { query(n*2,l,mid); query(n*2+1,mid+1,r); } } int main() { int n,q,i,j; scanf("%d %d",&n,&q); for(i=1;i<=n;i++) scanf("%d",&h[i]); build(1,n,1); while(q--) { scanf("%d %d",&i,&j); if(i==j) { printf("0/n"); continue; } a=0x7fffffff; b=-0x7fffffff; query(1,i,j); printf("%d/n",b-a); } return 0; }