poj3264

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zz_ylolita/article/details/51983031

水一发线段树,顺便复习(骗经验)...宝宝还是想好好走下去^ ^

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define N 50010
int n,q,x,y,m1,m2;
int a[N];
struct node{
    int l,r,m1,m2,num;
}tr[N*4];
void updata(int p)
{
    if (!p) return ;
    tr[p].m1=max(tr[p<<1].m1, tr[p<<1|1].m1);
    tr[p].m2=min(tr[p<<1].m2, tr[p<<1|1].m2);
}
void build(int p,int l,int r)
{
    tr[p].l=l;tr[p].r=r;
    if (l==r) {tr[p].m1=tr[p].m2=tr[p].num=a[l];return ;}
    int mid=(l + r) >> 1;
    build(p<<1, l, mid);
    build(p<<1|1, mid+1, r);
    updata(p);
}
int ask_max(int p,int l,int r)
{
    if (tr[p].l==l && tr[p].r==r)
        return tr[p].m1;
    int mid=(tr[p].l + tr[p].r) >> 1;
    if (r<=mid) return ask_max(p<<1, l, r);
    if (l>mid) return ask_max(p<<1|1, l, r);
    if (l<=mid && r>mid)
    {
        int s1=ask_max(p<<1, l, mid);
        int s2=ask_max(p<<1|1, mid+1, r);
        return max(s1,s2);
    }
}
int ask_min(int p, int l, int r)
{
    if (tr[p].l==l && tr[p].r==r)
        return tr[p].m2;
    int mid=(tr[p].l+tr[p].r) >> 1;
    if (r<=mid) return ask_min(p<<1, l, r);
    if (l>mid) return ask_min(p<<1|1, l, r);
    if (l<=mid && r>mid)
    {
        int s1=ask_min(p<<1, l, mid);
        int s2=ask_min(p<<1|1, mid+1, r);
        return min(s1,s2);
    }
}
int main()
{
    scanf("%d%d", &n, &q);
    for (int i=1;i<=n;i++) scanf("%d", &a[i]);
    build(1,1,n);
    while (q--)
    {
        scanf("%d%d", &x, &y);
        m1=ask_max(1,x,y);
        m2=ask_min(1,x,y);
        printf("%d\n", m1-m2);
    }
}


猜你喜欢

转载自blog.csdn.net/zz_ylolita/article/details/51983031