线段树求区间最大值与最小值的差

来源:互联网 发布:2016年的淘宝怎么操作 编辑:程序博客网 时间:2024/05/18 13:26

http://poj.org/problem?id=3264

#include <cmath>#include<stdio.h>#include<string.h>#include<iostream>using namespace std;#define L(x) (x << 1)#define R(x) (x << 1 | 1)#define INT_MAX 0x7fffffffconst int MAX = 50010;struct Tnode{    int mmax,mmin,val;    int l,r;};Tnode node[MAX*3];int v[MAX],big,small;void init(){    memset(node,0,sizeof(node));}void build(int t,int l,int r){    node[t].l=l;    node[t].r=r;    if(l==r-1)    {        node[t].mmin=v[l];        node[t].mmax=v[l];        return ;    }    int mid =(l+r)>>1;    build(L(t),l,mid);    build(R(t),mid,r);    node[t].mmax=max(node[L(t)].mmax,node[R(t)].mmax);    node[t].mmin=min(node[L(t)].mmin,node[R(t)].mmin);}void get(int t,int l,int r){    if(node[t].l==l&&node[t].r==r)    {        big=max(node[t].mmax,big);        small=min(node[t].mmin,small);        return ;    }    int mid=(node[t].l+node[t].r)>>1;    if(l>=mid)         get(R(t),l,r);    else if(r<=mid)         get(L(t),l,r);    else    {        get(R(t),mid,r);        get(L(t),l,mid);    }}int main(){    int n,m,x,y;    while( ~scanf("%d%d",&n,&m))    {        init();        for(int i=1; i<=n; i++)            scanf("%d",&v[i]);        build(1,1,n+1);        while(m--)        {            scanf("%d%d",&x,&y);            small=INT_MAX; big=0;            get(1,x,y+1);            printf("%d\n",big-small);        }    }return 0;}