【BZOJ】1699: [Usaco2007 Jan]Balanced Lineup排队(rmq/树状数组)

http://www.lydsy.com/JudgeOnline/problem.php?id=1699

我是用树状数组做的。。rmq的st的话我就不敲了。。

#include <cstdio>

#include <cstring>

#include <cmath>

#include <string>

#include <iostream>

#include <algorithm>

using namespace std;

#define rep(i, n) for(int i=0; i<(n); ++i)

#define for1(i,a,n) for(int i=(a);i<=(n);++i)

#define for2(i,a,n) for(int i=(a);i<(n);++i)

#define for3(i,a,n) for(int i=(a);i>=(n);--i)

#define for4(i,a,n) for(int i=(a);i>(n);--i)

#define CC(i,a) memset(i,a,sizeof(i))

#define read(a) a=getint()

#define print(a) printf("%d", a)

#define dbg(x) cout << #x << " = " << x << endl

#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }

inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }

inline const int max(const int &a, const int &b) { return a>b?a:b; }

inline const int min(const int &a, const int &b) { return a<b?a:b; }



const int N=50005, oo=~0u>>1;

int mx[N], mn[N], n, q, a[N];

void update(int x, int c) { for(; x<=n; x+=x&-x) mx[x]=max(mx[x], c), mn[x]=min(mn[x], c); }

int ask(int l, int r) {

	int x=-oo, y=oo;

	while(l<=r) {

		if(r-l+1>=(r&-r)) {

			y=min(y, mn[r]);

			x=max(x, mx[r]);

			r-=r&-r;

		}

		else {

			y=min(y, a[r]);

			x=max(x, a[r]);

			--r;

		}

	}

	return x-y;

}



int main() {

	read(n); read(q);

	int x, y;

	CC(mx, -1); CC(mn, 0x7f);

	for1(i, 1, n) { read(a[i]); update(i, a[i]); }

	for1(i, 1, q) {

		read(x); read(y);

		printf("%d\n", ask(x, y));

	}

	return 0;

}

 

 


 

 

Description

每 天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 <= Q <= 180,000) 个可能的牛的选择和所有牛的身高 (1 <= 身高 <= 1,000,000). 他想知道每一组里面最高和最低的牛的身高差别. 注意: 在最大数据上, 输入和输出将占用大部分运行时间.

Input

* 第一行: N 和 Q. * 第2..N+1行: 第i+1行是第i头牛的身高.

 * 第N+2..N+Q+1行: 两个整数, A 和 B (1 <= A <= B <= N), 表示从A到B的所有牛.

Output

*第1..Q行: 所有询问的回答 (最高和最低的牛的身高差), 每行一个.

Sample Input

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

Sample Output

6
3
0

HINT

Source

你可能感兴趣的:(USACO)