Balanced Lineup
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 43893   Accepted: 20585
Case Time Limit: 2000MS

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 to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous range of cows from the milking lineup to play the game. However, for all the cows to have fun they should not differ too much in height.

Farmer John has made a list of Q (1 ≤ Q ≤ 200,000) potential groups of cows and their heights (1 ≤ height ≤ 1,000,000). For each group, he wants your help to determine the difference in height between 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 height of 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 a response to a reply and indicates the difference in height between the 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<iostream>
#include<cstdio>
#include<cstring>
#define N 50101
#define K 17
using namespace std;
int hige[N],n,q,l,r;
int min_rmq[N][K+1];
int max_rmq[N][K+1];
int ff[(1<<K)+1];
void input()//读入数据
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;++i)
scanf("%d",&hige[i]);
} void pre_chuli()
{
for(int i=1;i<=n;++i)//初始化长度为2^0的情况
{
min_rmq[i][0]=hige[i];
max_rmq[i][0]=hige[i];
}
for(int j=1;j<=K;++j)
for(int i=1;i+(1<<j)-1<=n;++i)//处理min_rmq[][]和max_rmq[][],第一个中括号放开始点的位置,第二个中括号放区间的长度
{
min_rmq[i][j]=min(min_rmq[i][j-1],min_rmq[i+(1<<j-1)][j-1]);
max_rmq[i][j]=max(max_rmq[i][j-1],max_rmq[i+(1<<j-1)][j-1]);
}
memset(ff,-1,sizeof(ff));
ff[0]=0;
for(int i=0;i<=K;++i)
ff[1<<i]=i;
for(int i=1;i<=(1<<K);++i)//处理当长度为i时,最大的2^t
if(ff[i]==-1)
ff[i]=ff[i-1];
} int max_query(int l,int r)//区间最大值
{
int t=ff[r-l+1];//取长度范围内的最大的2^t
return max(max_rmq[l][t],max_rmq[r-(1<<t)+1][t]);
} int min_query(int l,int r)//区间最小值
{
int t=ff[r-l+1];//取长度范围内的最大的2^t
return min(min_rmq[l][t],min_rmq[r-(1<<t)+1][t]);
} int main()
{
input();
pre_chuli();
for(int i=1;i<=q;++i)
{
scanf("%d%d",&l,&r);
printf("%d\n",max_query(l,r)-min_query(l,r));
}
return 0;
}

  

最新文章

  1. C#夯实基础之多线程三:线程的优先级
  2. mysql binlog日志优化及思路
  3. extjs4 各种怪异问题
  4. Smokeping安装教程
  5. swift block
  6. Sql Server 常用操作2
  7. Google地图实现
  8. oracle检查点队列(checkpoint queue)
  9. USB描述符概述
  10. Form_Form与OAF页面互相调用(案例)
  11. Nodejs笔记(一)
  12. hdu 3404 Switch lights 博弈论
  13. Oracle登陆及修改用户密码
  14. MYSQL Model报错:指定的存储区提供程序在配置中找不到 的解决
  15. Windows环境下用C#编程将文件上传至阿里云OSS笔记
  16. ACE模板之Jqgrid
  17. 目标指向、Icon图标的错误
  18. Python批量重命名
  19. ArcGIS 10.5 named user介绍
  20. Neural Networks and Deep Learning(神经网络与深度学习) - 学习笔记

热门文章

  1. JavaScript(第十九天)【DOM进阶】
  2. Linux学习--线程控制
  3. 使用HttpClient4.5实现HTTPS的双向认证
  4. 吝啬的国度 nyoj
  5. ThreadLocal源码分析:(一)set(T value)方法
  6. Python设计TFTP客户端
  7. ASP.NET 访问项目网站以外的目录文件
  8. JQ 标签相关知识
  9. SpringCloud的应用发布(一)SpringCloud的样例工程
  10. maven入门(8)maven的依赖管理