バランスのとれたラインナップ(更新間隔+クエリ)

あなたの長さn、[N](50000≤1≤N)、クエリQのシーケンスを与えるために(1≤Q≤200000)回出力[L、R]の最大値と最小間隔との差です。
そう簡単に〜
そう簡単に〜
そう簡単に〜

入力

ケースの複数組
二つの整数N、Qの最初の行
およびN [i]は[i]は1E9未満であることを確実にする数であります
各Qは、その後、あなたにLを依頼され、Rは、確保するため、(1 <= L <= R <= N)

出力

最大値と最小間隔との間の各質問[L、R]の差の出力は、数あります

サンプル入力

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

サンプル出力

6 
3 
0
書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <cstdioを> 
する#include < 文字列 > 
の#include <CStringの> 
の#include <cstdlib> 
書式#include <マップ> 
書式#include <ベクトル> 
の#include < 設定 > 
書式#include <キュー> 
書式#include <スタック> 
の#include <cmath> 
typedefの長い 長いLL。
#define PQL PRIORITY_QUEUE <LL>
 の#define PQ PRIORITY_QUEUE <整数>
 の#define Vベクトル<整数>
#define LSONインデックス<< 1、L、中間
 の#define rsonインデックス<< 1 | 1、中間+ 1、R用
 の#define読み取る(X)のscanf( "%dの"、およびX)
 の#define LREAD(X)のscanf(」 %のLLD」、&x)は、
#define PT(X)のprintf( "%d個の\ n"、(X))
 の#defineイエスのprintf( "YES \ n");
#defineなしのprintf( "NOの\ n");
#define GCD __gcd
 の#define CN CIN >>
 の#define CT COUT <<
 の#define ED << ENDL用
 の#define担当者(J、K)のための(INT I =(INT)〜(j)は、iが<=(INT)(K ); iは++)
 の#define入力(k)に対する(INT i = 1; i)は=(INT)(kは<; iは++){CIN >> [I]。}
 の#define MEM(S、
OKリターン0;
#defineリターン再;
#define TLEのstd ::イオス:: sync_with_stdio(偽); cin.tie(NULL); cout.tie(NULL);
#define MOD(x)は、((X)%9973)
 の#define試験COUT << "++++++" << ENDL。
#define LCインデックス<< 1つ
 の#define RC指数<< 1 | 1
 使用して 名前空間はstdを、
const  int型 MX = 1000005 ;
int型トン、ANS、MAXN = -MX、ミネソタ州= MX。
typedef 構造体ノードは
{ 
    int型のVal、L、R、MX、MN、怠惰、和を、
}ノード; 
ノードDP [MX]。
INT [MX]。
無効アップ(int型インデックス)
{ 
    DP [インデックス] .MX = MAX(DP [LC] .MX、DP [RC] .MX)。
    DP [インデックス] .mn = 分(DP [LC] .mn、DP [RC] .mn)。
} 
ボイドビルド(int型のインデックス、int型の L、INT R)
{ 
    DP [インデックス] .L = L。
    DP [インデックス] .R = R。
    もし(L == R)
    { 
        DP [インデックス] .MX = [L]。
        DP [インデックス] .mn = [L]。
        再; 
    } 
    INT半ば=(L + R)>> 1 
    (LC、L、ミッド)を構築。
    (RC、中旬を構築+ 1 、R)。
    (インデックス)まで。
} 

ボイドクエリ(int型のインデックス、int型の L、INT R)
{ 
    // もし(DP [ルート] .MX <=ミネソタ州&& DP [ルート]の.mi> = MAXN)再。
    もし(DP [インデックス] .L> = L && DP [インデックス] .R <= R)
    { 
        MAXN = MAX(DP [インデックス] .MX、MAXN)。
        ミネソタ州 = 分(DP [インデックス] .mn、ミネソタ州)。
        再; 
    } 
    INT半ば=(DP [インデックス] .L + DP [インデックス] .R)>> 1 もし(L <= MID)
    { 
        クエリ(LC、L、R)。
    }
    もし、(R>MID)
    { 
        クエリ(RC、L、R)。
    } 

} 
int型のmain()
{ 
    TLE。
    INTのN、K、LL、RR。
    一方、(CNのN >> K)
    { 
        担当者(1 、N)CN [I]。
        ビルド(11 、N)
        担当者(1 、K)
        { 
            MAXN = - 1、ミネソタ州= 1E9 + 5 
            CIN >> LL >> RR。
            クエリ(1 、LL、RR)。
            coutの << MAXN、ミネソタ州<< てendl;
        }


    } 
    OK。
}

 

おすすめ

転載: www.cnblogs.com/Shallow-dream/p/11470101.html