线段树

来源:互联网 发布:android入门编程视频 编辑:程序博客网 时间:2024/06/05 20:58
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int height[55555];
int maxx,minn;
struct p
{
    int l,r;
    int min,max;
}tree[4111111];
void build(int l,int r,int n)
{
    tree[n].l=l;
    tree[n].r=r;
    if(l==r)
    {
       tree[n].max=tree[n].min=height[l];
       return;
    }
    int mid=(l+r)/2;
    build(l,mid,n*2);
    build(mid+1,r,n*2+1);
    tree[n].max=max(tree[n*2].max,tree[n*2+1].max);
    tree[n].min=min(tree[n*2].min,tree[n*2+1].min);
}
void sql(int l,int r,int n)
{
    if(l==tree[n].l&&r==tree[n].r)
    {
        maxx=max(tree[n].max,maxx);
        minn=min(tree[n].min,minn);
        return;
    }
    int mid=(tree[n].r+tree[n].l)/2;
    if(l>mid)
    sql(l,r,n*2+1);
    else
    if(r<=mid)
    sql(l,r,2*n);
    else
    {
        sql(l,mid,n*2);
        sql(mid+1,r,n*2+1);
    }
}
int main()
{
    int n,q;
    int i,j,k,l,m,r;
    cin>>n>>q;
    for(i=1;i<=n;i++)
    scanf("%d",&height[i]);
    build(1,n,1);
    for(i=0;i<q;i++)
    {
        scanf("%d%d",&l,&r);
        minn=999999999;
        maxx=-minn;
        sql(l,r,1);
        printf("%d\n",maxx-minn);
    }
    return 0;
}
0 0