#include<stdio.h>
#include<iostream>
using namespace std;
struct node {
int left;
int right;
int max;
int min;
}a[5000000];
int p[5000000];
void build(int l, int r, int k){
a[k].left=l;
a[k].right=r;
if(l==r){
a[k].max=a[k].min=p[r];
return;
}
a[k].min=1000000000;
a[k].max=-1000000000;
build(l,(l+r)/2,k*2);
build((l+r)/2+1,r,k*2+1);
}
int ansmax,ansmin,l;
void query(int l, int r, int k) {
if(l==a[k].left && r==a[k].right) {
ansmax=max(a[k].max,ansmax);
ansmin=min(a[k].min,ansmin);
return ;
}
if(a[k].left == a[k].right)
return ;
int mid = (a[k].left + a[k].right)/2;
if(r<=mid)
query(l, r, k*2);
else if(l>mid)
query(l, r, k*2+1);
else {
query(l, mid, k*2);
query(mid+1, r, k*2+1);
}
}
int work2(int k){
if(a[k*2].right==0)return a[k].max;
int a1=work2(k*2),a2=work2(k*2+1);
a[k].max=max(a1,a2);
return a[k].max;
}
int work3(int k){
if(a[k*2].right==0)return a[k].max;
int a1=work3(k*2),a2=work3(k*2+1);
a[k].min=min(a1,a2);
return a[k].min;
}
int main(){
int i,n,m,k,x,y,z;
scanf("%d",&n);
scanf("%d",&m);
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
build(1,n,1);
work2(1);
work3(1);
for(i=1;i<=m;i++){
ansmax=-100000000;
ansmin=100000000;
scanf("%d%d",&x,&y);
query(x,y,1);
printf("%d\n",ansmax-ansmin);
}
return 0;
}
POJ3264Balanced Lineup题解-线段树
最新推荐文章于 2020-04-17 16:16:07 发布