线段树求解区间最大最小值(模板)

来源:互联网 发布:工业大数据面临的问题 编辑:程序博客网 时间:2024/05/22 09:45

题目描述

第一行:输入两个正整数

第二行:输入n个整数 大小范围为[1,100000];

接下来的m,每次两个正整数l,r (1<=l<=r<=n);

输出

[l,r].

示例输入

6 3
1
7
3
4
2
5
1 5
4 6
2 2

示例输出

6
3
0
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#define LL long long#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1using namespace std;int ma[1000000];int mi[1000000];void Up(int rt){    ma[rt]=max(ma[rt<<1],ma[rt<<1|1]);    mi[rt]=min(mi[rt<<1],mi[rt<<1|1]);}void built(int l,int r,int rt){    if(l==r)    {        scanf("%d",&mi[rt]);        ma[rt]=mi[rt];        return ;    }    int mid=(l+r)>>1;    built(lson);    built(rson);    Up(rt);}int Q1(int x,int y,int l,int r,int rt){    if(x<=l&&y>=r)    {        return ma[rt];    }    int mid=(l+r)>>1;    if(y<=mid)    {        return Q1(x,y,lson);    }    else if(x>mid)    {        return Q1(x,y,rson);    }    else        return max(Q1(x,y,lson),Q1(x,y,rson));}int Q2(int x,int y,int l,int r,int rt){    if(x<=l&&y>=r)    {        return mi[rt];    }    int mid=(l+r)>>1;    if(y<=mid)    {        return Q2(x,y,lson);    }    else if(x>mid)    {        return Q2(x,y,rson);    }    else        return min(Q2(x,y,lson),Q2(x,y,rson));}int main(){    int n,m,i,j,k;    while(~scanf("%d%d",&n,&m))    {        built(1,n,1);        while(m--)        {            int x,y;            scanf("%d%d",&x,&y);            printf("%d\n",Q1(x,y,1,n,1)-Q2(x,y,1,n,1));        }    }    return 0;}


0 0