poj 3264

题意:给你一组值,然后询问某个区间的最大值和最小值之差
分析:因为没有更新,所以只需要查找即可,节点保存一个最大值最小值就行了
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<stdlib.h>
using namespace std;
#define INF 0xfffffff

#define Lson rt<<1
#define Rson rt<<1|1
#define N 50010
struct node
{
    int L, R, mid;
    int x, y;
}a[N<<2];
int Max, Min, b[N];
void buildsegtree(int rt, int L, int R);
void query(int rt, int L, int R);

int main()
{
    int n, m, i, j;
    scanf("%d%d", &n, &m);

    for(int k=1; k<=n; k++)
        scanf("%d", &b[k]);

    buildsegtree(1, 1, n);

    while(m--)
    {
        Max=-INF; Min=INF;
        scanf("%d%d", &i, &j);
        query(1, i, j);
        printf("%d\n", Max-Min);
    }
}

void buildsegtree(int rt, int L, int R)
{
    a[rt].L=L;
    a[rt].R=R;
    a[rt].mid=(L+R)>>1;

    if(L==R)
    {
        a[rt].x=a[rt].y=b[L];
        return;
    }

    buildsegtree(Lson, L, a[rt].mid);
    buildsegtree(Rson, a[rt].mid+1, R);
    a[rt].x=min(a[Lson].x, a[Rson].x);
    a[rt].y=max(a[Lson].y, a[Rson].y);
}

void query(int rt, int L, int R)
{
    if(a[rt].L==L&&a[rt].R==R)
    {
        Max=max(a[rt].y, Max);
        Min=min(a[rt].x, Min);

        return;
    }

    if(R<=a[rt].mid)
        query(Lson, L, R);
    else if(a[rt].mid<L)
        query(Rson, L, R);
    else
    {
        query(Lson, L, a[rt].mid);
        query(Rson, a[rt].mid+1, R);
    }
}

 

posted @ 2015-08-20 10:49  花开须臾  阅读(167)  评论(0编辑  收藏  举报