一开始想的是写两个查询一个找最大值,一个找最小值,没想到却tle,,最后写了一个查询,,却莫名其妙的过了,杯具的线段树求法~~~~
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<climits>
#include<algorithm>
using namespace std;
const int MAX = 0xfffffff;
const int N = 100005;
int maxsum, minsum;
struct segtree
{ int l;
int r;
int max;
int min;
}seg[N << 2];
void Build_Tree(int t,int l,int r)
{
seg[t].l=l;
seg[t].r=r;
if(l == r)
{
scanf("%d", &seg[t].max);
seg[t].min = seg[t].max;
return ;
}
int m = (l + r) >> 1;
Build_Tree(t<<1,l,m);
Build_Tree(t<<1|1,m+1,r);
seg[t].max = max(seg[t << 1].max, seg[(t << 1) + 1].max);
seg[t].min = min(seg[t << 1].min, seg[(t << 1) + 1].min);
}
void Query(int t,int l,int r)
{
if(l<= seg[t].l && seg[t].r <= r)
{
maxsum = max(maxsum, seg[t].max);
minsum = min(minsum, seg[t].min);
return ;
}
if(r<=seg[t<<1].r) Query(t<<1,l,r);
else if(l>seg[t<<1].r) Query(t<<1|1,l,r);
else
{
Query(t<<1,l,seg[t<<1].r);
Query(t<<1|1,seg[t<<1|1].l,r);
}
}
int main()
{
int n, q;
int a, b;
while(scanf("%d%d", &n, &q) != EOF)
{
Build_Tree(1,1,n);
while(q--)
{
scanf("%d %d", &a, &b);
maxsum = -MAX, minsum = MAX;
Query(1,a,b);
printf("%d\n", maxsum-minsum);
}
}
return 0;
}