毎日搾乳のために、ファーマージョンの Nの 牛(1≤ N ≤50,000)は、常に同じ順序で並べます。ある日ファーマージョンは牛のいくつかとフリスビーのゲームを整理することを決定します。物事をシンプルに保つために、彼はゲームをプレイするために搾乳ラインナップから牛の連続した範囲がかかります。しかし、楽しみを持っているすべての牛のために、彼らは高さがあまり異なってはなりません。
ファーマージョンはリストにした Q (1≤ Q ≤20万)乳牛の潜在的なグループとその高さ(1つの≤ 高さ ≤1,000,000)。各グループのために、彼は最短とグループで最も高い牛の高さの差を決定するためにあなたの助けを望んでいます。
入力
1行目:二スペースで区切られた整数、
N
および
Q
。
行2 .. N +1:ライン I +1は、牛の高さである単一の整数含ま I
線 N +2を.. N + Q +1:二つの整数 A と B (1≤ A ≤ B ≤ N )、牛の範囲を表す A に Bを 包括します。
行2 .. N +1:ライン I +1は、牛の高さである単一の整数含ま I
線 N +2を.. N + Q +1:二つの整数 A と B (1≤ A ≤ B ≤ N )、牛の範囲を表す A に Bを 包括します。
出力
行1 ..
Q
:各行は、応答に対応し、範囲内の最も高いと最短牛の高さの差を表す単一の整数を含んでいます。
サンプル入力
6 3 1 7 3 4 2 5 1〜5 4 6 2 2
サンプル出力
6 3 0
質問の意味:あなたは、配列の長さを与えるためには50,000を超え、その後、最小差に指定されたエリアにあなたの最大値を求めていません。
思考:要求操作のでクラス間隔、最初のセグメントツリー、この問題は、比較的単純な、第一各ツリーノードの初期化ラインセグメントの2つの値が設定されている、それぞれ、最大値と、このノードの最小値
。データが大きくないので、二つの部分の評価方法を記述することができるので、最大値は、最小値を求めて、ライン上の減算を求めます。
コード:
1の#include <cstdioを> 2の#include <fstreamの> 3の#include <アルゴリズム> 4の#include <cmath> 5の#include <両端キュー> 6の#include <ベクトル> 7の#include <キュー> 8の#include < ストリング > 9# <CStringの>含む 10の#include <地図> 11の#include <スタック> 12の#include < セット > 13の#include <sstream提供さ> 14の#include <入出力ストリーム> 15 の#define MOD 998244353 16 の#define EPS 1E-6 17 の#define LLロングロング 18である の#define INF 0x3f3f3f3f 19。 使用した 名前空間STD; 20である 21れる 構造体ノード 22は 、{ 23は // Lは左側を表し、rは右側表す 24 のint 、L、R、miザ、マサチューセッツ州 25 26れている }; 27ノードNO [ 500000 ]; 28 INT NUM [ 50000 ]; 29 30 // 初期化 31される // Kは、現在のノードの数を表し、lは現在の間隔の左端を表し、rは現在のセグメントの右側の境界を表し 32 空隙ビルド(int型 Kを、INT L、INT R&LT) 33である { 34は NO [K] .L = L; 35 NO [K] .R = R&LT; 36 // もし最低点まで再帰 37 IF(L == R&LT) 38である { 39 NO [K ]の.mi = NUM [L]; 40 NO [K] = .ma NUM [L]; 41である 戻り、 42である } 43れる // 半分のポイント 44である int型 MID =(L + R&LT)/ 2 ; 45 // 再帰左側にライン 46は、 ビルド(K * 2 、L、MID)。 47 // 右線に再帰 48 ビルド(K * 2 + 1、MID + 。1 、R&LT); 49 // 更新ノードの現在値 50 NO [K] =分の.mi(NO [K * 2 ]の.mi、NO [K * 2 + 1 ]の.mi); 51である NO [K] .ma = MAX(NO [K * 2 ] .ma、NO [K * 2 + 1 ] .ma); 52である } 53れる // 間隔を見つけます最小 54は、 INT querymi(INT K、INT L、INT R&LT) 55 { 56である // 対応する層への戻り値 57 であれば(NO [k]が.L == L && NO [K] .R == R) 58 { 59 リターンはない[K]の.mi。 60 } 61 // 取中值 62 int型ミッド=(NO [K] .L + NO [K] .R)/ 2 。 63 であれば(R <= MID) 64 { 65 リターン querymi(K * 2 、L、R)。 66 } 67 他の 場合(L> MID) 68 { 69 リターン querymi(K * 2 + 1 、L、R)。 70 } 71である 他の 72 { 73が リターン分(querymi(K * 2、L、MID)、querymi(K * 2 + 1、MID + 1 、R&LT)); 74 } 75 } 76 // 要求間隔最大値 77 のint queryma(整数 K、INT L、INT R&LT) 78 { 79 // 対応する層への戻り値 80 IF(NO [K] .L L == NO && [K] .R == R&LT) 81 { 82 リターンNO [K]。ミリアンペア; 83 } 84 // 取中值 85 int型ミッド=(NO [K] .L + NO [K] .R)/ 2 。 86 であれば(R <= MID) 87 { 88 リターン queryma(K * 2 、L、R)。 89 } 90 他の 場合(L> MID) 91 { 92 リターン queryma(K * 2 + 1 、L、R)。 93 } 94 他の 95 { 96 リターン MAX(queryma(K * 2、L、MID)、queryma(K * 2 + 1、ミッド+ 1 、R)); 97 } 98 } 99 のint main()の 100 { 101 INTのQ、N。 102 のscanf(" %D%D "、&N、&Q)。 103 のための(INT iは= 1 ; iが<= N; I ++ ) 104 { 105 のscanf(" %dの"、およびNUM [I])。 106 } 107 ビルド(1、1 、N) 108 INT A、B。 109 のための(INT iは= 0 ; I <Q I ++ ) 110 { 111 のscanf(" %D%D "、&、&B)。 112 のprintf(" %D \ n "、queryma(1、B)-querymi(1 、B))。 113 } 114 }