效率至上

来源:互联网 发布:无需网络的监控摄像头 编辑:程序博客网 时间:2024/04/29 04:26

Problem Description

题意很简单,给出一个数目为n的非有序序列,然后有m次查询.对于每次查询输入两个正整数l,r请输出区间[l,r]的最大值与最小值的差值

Input

第一行:输入两个正整数n,m    (1<=n<=50000,  1<=m<=200000  )

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

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

Output

输出区间[l,r]最大值与最小值的差值.

Example Input

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

Example Output

6
3
0
 
#include<stdio.h>#include<stdlib.h>#define maxn 200010#define lson l,m,rt*2#define rson m+1,r,rt*2+1int sum[maxn];int max[maxn];int min[maxn];int mx=-1,mn=0x3f3f3f;int qmax(int a,int b){    return (a>b?a:b);}int qmin(int a,int b){    return (a>b?b:a);}void pushup (int rt){    sum[rt]=sum[rt*2]+sum[rt*2+1];    max[rt]=qmax(max[rt*2],max[rt*2+1]);    min[rt]=qmin(min[rt*2],min[rt*2+1]);}void build (int l,int r,int rt){    int m;    if(l==r)    {        scanf("%d",&sum[rt]);        max[rt]=min[rt]=sum[rt];        return ;    }    m=(l+r)/2;    build(lson);    build(rson);    pushup(rt);}void max_min(int L,int R,int l,int r,int rt){    int m;    if(L<=l&&R>=r)    {        if(max[rt]>mx)            mx=max[rt];        if(min[rt]<mn)            mn=min[rt];        return ;    }    m=(l+r)/2;    if(L<=m)        max_min(L,R,lson);    if(R>m)        max_min(L,R,rson);}int main(){    int n,m,i;    int L,R;    scanf("%d%d",&n,&m);    build(1,n,1);    while(m--)    {        scanf("%d%d",&L,&R);        max_min(L,R,1,n,1);        printf("%d\n",mx-mn);        mx=-1;        mn=0x3f3f3f;    }    return 0;}
0 0
原创粉丝点击