线段树模板
题意:给出每个位置的值,求某一区间内最大值与最小值之差
非常简单的线段树模板题,很久没有做这类题,连代码也忘记怎么敲了,写一下以后方便查找
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
int a[maxn];
int ma[maxn<<2],mi[maxn<<2],tree[maxn<<2];
void build(int l,int r,int p)
{
if(l==r)
{
ma[p]=a[l];
mi[p]=a[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
ma[p]=max(ma[p<<1],ma[p<<1|1]);
mi[p]=min(mi[p<<1],mi[p<<1|1]);
}
int query1(int l,int r,int L,int R,int p)
{
if(l==L&&r==R)
{
return ma[p];
}
int mid=(l+r)>>1;
if(R<=mid)
return query1(l,mid,L,R,p<<1);
else if(L>mid)
return query1(mid+1,r,L,R,p<<1|1);
else
return max(query1(l,mid,L,mid,p<<1),query1(mid+1,r,mid+1,R,p<<1|1));
}
int query2(int l,int r,int L,int R,int p)
{
if(l==L&&r==R)
{
return mi[p];
}
int mid=(l+r)>>1;
if(R<=mid)
return query2(l,mid,L,R,p<<1);
else if(L>mid)
return query2(mid+1,r,L,R,p<<1|1);
else
return min(query2(l,mid,L,mid,p<<1),query2(mid+1,r,mid+1,R,p<<1|1));
}
//void update(int l,int r,int L,int R,int p)
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,n,1);
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
int s1=query1(1,n,x,y,1);
int s2=query2(1,n,x,y,1);
printf("%d\n",s1-s2);
}
return 0;
}