CDOJ_1591_An easy problem A(线段树水题)

An easy problem A

Edit
Time Limit: 1000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

N个数排成一列,Q个询问,每次询问一段区间内的数的极差是多少。

Input

第一行两个整数N(1≤N≤50000),Q(1≤Q≤200000)。接下来一行N个整数a1 a2 a3 ....an,(1≤ai≤1000000000)。接下来Q行,每行两个整数L,R(1≤L≤R≤N)。

Output

对于每个询问输出一行,一个整数表示区间内的极差。

Sample input and output

Sample Input Sample Output
5 3
3 2 7 9 10
1 5
2 3
3 5
8
5
3

解:线段树水题,不用多说。

代码:

#include 
#include 
#include 
#include 
using namespace std;
const int maxn=5e4+100;
const int INF=0x3f3f3f3f;
int a[maxn];
struct Segtree{
    int l,r;
    int mxx,mnn;
}seg[maxn<<2];
void build(int node ,int l,int r)
{
    seg[node].l=l;seg[node].r=r;
    if(l==r){seg[node].mxx=seg[node].mnn=a[l];return;}
    int mid=(l+r)/2;
    build(node<<1,l,mid);
    build(node<<1|1,mid+1,r);
    seg[node].mxx=max(seg[node<<1].mxx,seg[node<<1|1].mxx);
    seg[node].mnn=min(seg[node<<1].mnn,seg[node<<1|1].mnn);
}
int mx,mn;
void query(int node ,int l,int r)
{
    if(seg[node].l>=l&&seg[node].r<=r){mx=max(seg[node].mxx,mx);mn=min(seg[node].mnn,mn);return;}
    int mid=(seg[node].l+seg[node].r)/2;
    if(l>mid)
    query(node<<1|1,l,r);
    else if(r<=mid)
    query(node<<1,l,r);
    else
    {
        query(node<<1,l,mid);
        query(node<<1|1,mid+1,r);
    }
}
int main()
{
    int n,q;
    while(~scanf("%d%d",&n,&q))
    {
        for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
        build(1,1,n);
        // printf("%d %d\n",seg[1].mxx,seg[1].mnn);
        int l,r;
        while(q--)
        {
            mx=-INF;
            mn=INF;
            scanf("%d%d",&l,&r);
            query(1,l,r);
            printf("%d\n",mx-mn);
        }
    }
    return 0;
}






你可能感兴趣的:(线段树)