线段树!憋不住,还是做了一题,不过也做的我够呛。。慢慢爬的孩子伤不起!!!
题意就是: 找出给定区间内最大的值和最小的值的差值!
Memory: 2412KTime: 1625MSLanguage: C++Result: Accepted
#include<stdio.h>
#define MAXN 50001
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a<b?a:b
int val[MAXN];
struct node
{
int r,l;
int max,min;
}f[4*MAXN];
int max,min;
void build(int l,int r,int step)
{
f[step].l=l;
f[step].r=r;
if(l==r)
{
f[step].max=f[step].min=val[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,step<<1);
build(mid+1,r,step<<1|1);
f[step].max=MAX(f[step<<1].max,f[step<<1|1].max);
f[step].min=MIN(f[step<<1].min,f[step<<1|1].min);
// printf("%d %d step:%d l:%d r:%d\n",f[step].max,f[step].min,step,f[step].l,f[step].r);
}
void query(int l,int r,int step)
{
if(l==f[step].l&&r==f[step].r)
{
max=MAX(max,f[step].max);
min=MIN(min,f[step].min);
return;
}
int mid=(f[step].r+f[step].l)>>1;
if(r<=mid)
query(l,r,step<<1);
else if(l>mid)
query(l,r,step<<1|1);
else
{
query(l,mid,step<<1);
query(mid+1,r,step<<1|1);
}
}
int main()
{
int n,m,i,a,b;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&val[i]);
build(1,n,1);
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
max=0,min=1<<20;
query(a,b,1);
printf("%d\n",max-min);
}
return 0;;
}