Balanced Lineup

来源:互联网 发布:编程语言薪资排行 编辑:程序博客网 时间:2024/05/29 18:10

Description

For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000)always line up in the same order. One day Farmer John decides toorganize a game of Ultimate Frisbee with some of the cows. To keepthings simple, he will take a contiguous range of cows from themilking lineup to play the game. However, for all the cows to havefun they should not differ too much in height.

Farmer John has made a list of Q (1 ≤ Q ≤ 200,000) potentialgroups of cows and their heights (1 ≤ height ≤ 1,000,000). For eachgroup, he wants your help to determine the difference in heightbetween the shortest and the tallest cow in the group.

Input

Line 1: Two space-separated integers, N and Q.
Lines 2..N+1: Line i+1 contains a single integer that is the heightof cow i
Lines N+2..N+Q+1: Two integers A and B (1 ≤ A ≤ B ≤ N),representing the range of cows from A to B inclusive.

Output

Lines 1..Q: Each line contains a single integer that is aresponse to a reply and indicates the difference in height betweenthe tallest and shortest cow in the range.

Sample Input

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

Sample Output

6
3
0

 

 

代码:

#include<stdio.h>#include<math.h>struct node{    int l,r,max,min;};node a[200005];int flag[50005],da,xiao;void creattree(int i,int x,int y) //建树 从小区间递归 得到每个区间的 max和min{    int mid;    a[i].l=x;    a[i].r=y;    if(x==y)    {       a[i].min=a[i].max=flag[x];       return;     }    mid=(x+y)/2;    creattree(i*2,x,mid);    creattree(i*2+1,mid+1,y);    if(a[i*2].max>a[(i*2)+1].max)a[i].max=a[i*2].max;    else a[i].max=a[(i*2)+1].max;    if(a[i*2].min<a[(i*2)+1].min)a[i].min=a[i*2].min;    else a[i].min=a[(i*2)+1].min;}void update(int i,int x,int y){    int mid;    if(a[i].l==x && a[i].r==y)    {// 不断更新 所查找的 区间的 max 和 min 的值 直到所要查找的        区间都已被 查找出来。
        if(a[i].max>da)da=a[i].max;        if(a[i].min<xiao)xiao=a[i].min;        return ;    }    mid=(a[i].l+a[i].r)/2;      if(y<=mid)update(i*2,x,y);    else if(x>mid)update(i*2+1,x,y);    else    {        update(i*2,x,mid);        update(i*2+1,mid+1,y);    }}int main(){    int n,x,y,i,p;    while(scanf("%d%d",&n,&p)!=EOF)    {               for(i=1;i<=n;i++)scanf("%d",&flag[i]);            creattree(1,1,n);        for(i=0;i<p;i++)        {            da=0;            xiao=1000001;            scanf("%d%d",&x,&y);            update(1,x,y);            printf("%d\n",da-xiao);        }    }    return 0;}