hdu6621バイナリツリープラス会長

トピックリンクします。http://acm.hdu.edu.cn/showproblem.php PID = 6621?

 

問題の説明
A1、A2、、ANを、あなたは、いくつかのクエリに答える必要があります:あなたは、配列を持っています。
各クエリについて、あなたは区間[L、R]と二つの数pを与えられ、K.は、あなたの目標は...、AR、pとAL、AL + 1の間のK番目の最短距離を見つけることです。
|愛- P | PとAIの間の距離に等しいです。
例:
A = {31、2、5、45、4}及びL = 2、R = 5、p = 3、K = 2
| P - A2 | = 1、| P - A3 | = 2、| P - A4 | = 42、| P - A5 | = 1.
ソート距離は{1、1、2、42}です。したがって、第2の最も近い距離は1です。
 

 

入力
入力の最初の行は、T(1 <= T <= 3)テストケースの数を表す整数を含んでいます。
各テストケースのために:
冘最初の行は、2つの整数nとmを含有する(1 <= N、M <= 10 ^ 5)アレイとクエリの数の大きさを示します。
2行目は、n個のスペースで区切られた整数A1、A2、...、(1 <=は<= ^ 6 10愛)を含みます。配列の各値は一意です。
次のm行の各々は、4つの整数L「R」、P「及びK」を含みます。
これらの4個の数字から、あなたが本当のクエリLを取得する必要があり、R、P、Kのような:
ここで、L = L 'のxor X、R = R' XOR X、P = P 'のxor X、K = K'のXOR X、 Xが、ちょうど前の回答と先頭にあるX = 0
(1 <= L <R <= N、1 <= p <= 10 ^ 6、1 <= K <= 169、R - L + 1> = K)。
 

 

出力
各クエリに対して...、AR、P及びAl、AL + 1との間のK番目の最短距離を含む単一の行を印刷します。
 

 

サンプル入力
1
5 2
31 2 5 45 4
1 5 1
2 5 3 2
 

 

サンプル出力
0
1
 
間隔を求める| [I] -p |、前半答えをK少数、クエリ区間[P-ANS、P + ANS]はkに等しい数の数よりも大きいです
書式#include <iostreamの> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、
#defineっ長い長
 の#define最大1000000
 の#define MAXN 100005
 INT [MAXN]、B [MAXN]、T [MAXN << 5 ]、L [MAXN << 5 ]、R [MAXN << 5 ]、和[ MAXN << 5 ]、TOT。
インラインINTの更新(INTプリ、int型の L、int型の R、INT X)
{ 
    int型 RT = ++ TOT。
    L [RT] = L [事前]。
    R [RT] =  R [事前]と、
    和[RT] =和[事前] + 1 もし(L < R)
    { 
        int型ミッド= L + R >> 1 もし(x <= MID)L [RT] = アップデート(L [事前]、L、中、X)。
         R [RT] =アップデート(R [事前]、ミッド+ 1 、R、X)。
    } 
    戻りRT; 
} 
インラインint型の照会(INT U、INT V、INT QL、INT QR、INT L、INT R)
{ 
    場合(QL <= L && QR> = R)戻り和[V] - 和[U]。
    int型ミッド= L + R >> 
        {1、ANS = 0 もし(QL <= MID)ANS + = クエリ(L [U]、L [V]、QL、QR、L、MID)。
    もし(QR> MID)ANS + =クエリ(R [U]、R [V]、QL、QR、中間+ 1 、R)。
    戻るANSを。
} 
int型のmain()
{ 
    int型のT。
    cinを >> トン。
    INT W = 1 ; W <= T; W ++ 
    { 
        int型N、M。
        CIN >> N >> M。
        以下のためにint型 i = 1 ; iが= <N; iは++ 
            CIN >> [I]。 
        } 
        T [ 0 ] =合計[ 0 ] = L [ 0 ] = R [ 0 ] = TOT = 0 以下のためにint型 i = 1 ; iが<= N; iは++ 
        { 
            T [i]は =更新(T [I- 1 ]、1 、マックス、[I])。
        } 
        int型の L、R、P、K、X = 0 以下のためにint型私= 1 ; I <= M; iは++ 
        { 
            CIN >> L >> R >> P >> K。
            リットル^ = X; R ^ = X; P ^ = X; K ^ = X。
            INT PL = 0、PR = マックス。
            一方(PL < PR)
            { 
                int型ミッド= PL + PR >> 1 もし(クエリ(T 1- [ 1 ]、T [R]、MAX(1、P-MID)、分(最大、P + MID)、1、最大)> = K)
                { 
                    X = ミッド。
                    PR = 半ば; 
                } 
                 PL =ミッド+ 1 
            } 
            COUT << X << ENDL。
        } 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/chen99/p/11294015.html