Language: Default Balanced Lineup
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 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 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 Source |
最大最小差值
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 typedef __int64 ll; #define fre(i,a,b) for(i = a; i <b; i++) #define free(i,b,a) for(i = b; i >= a;i--) #define mem(t, v) memset ((t) , v, sizeof(t)) #define ssf(n) scanf("%s", n) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define bug pf("Hi\n") using namespace std; #define INF 0x3f3f3f3f #define N 50005 struct stud{ int le,ri; int mi,ma; }f[N*4]; int a[N],mi,ma; void build(int pos,int le,int ri) { f[pos].le=le; f[pos].ri=ri; if(le==ri) { f[pos].mi=f[pos].ma=a[le]; return ; } int mid=MID(le,ri); build(L(pos),le,mid); build(R(pos),mid+1,ri); f[pos].ma=max(f[L(pos)].ma,f[R(pos)].ma); f[pos].mi=min(f[L(pos)].mi,f[R(pos)].mi); } void query(int pos,int le,int ri) { if(f[pos].le==le&&f[pos].ri==ri) { mi=min(mi,f[pos].mi); ma=max(ma,f[pos].ma); return ; } int mid=MID(f[pos].le,f[pos].ri); if(mid>=ri) query(L(pos),le,ri); else if(mid<le) query(R(pos),le,ri); else { query(L(pos),le,mid); query(R(pos),mid+1,ri); } } int main() { int i,j; int n,m; while(~sff(n,m)) { fre(i,1,n+1) sf(a[i]); build(1,1,n); int le,ri; while(m--) { sff(le,ri); mi=INF; ma=-1; query(1,le,ri); pf("%d\n",ma-mi); } } return 0; }