マリオは世界的に有名な配管工です。彼の「たくましい」フィギュア、私たちの記憶に思い出させた驚くべき跳躍能力。今、貧しい姫が再び困っているマリオは彼の恋人を救うために必要です。私たちは、高さh1のレンガがあるすべての整数i点で、ライン(長さがnである)として上司の城への道を考えています。今の質問は、彼がジャンプすることができ、最大の高さがHである場合は、[L、R]にマリオがヒットすることができますどのように多くのレンガです
InputThe最初の行は整数T、試験データの数に従います。
各テストデータのため:
最初の行は二つの整数N、M含有する(1 <= N ^ 5 <= 10 ^ 5、1 <= M <= 10)、N道路の長さであり、mはクエリの数であります。
次の行は、範囲[0、1000000000]であり、nは整数、各ブリックの高さを含んでいます。
次のm行、各行に含まれる三つの整数L、R、H(0 <= L <= R <N、0 <= H <= 1000000000)OutputForそれぞれの場合、出力"ケースX"(Xは、ケース番号でありますm行に続く1)から出発して、各ラインは整数を含んでいます。i番目の整数は、マリオは、i番目のクエリにヒットすることができますレンガの数です。
サンプル入力
1 10 10 0 5 2 7 4 5 3 8 7 7 2 8 6 3 5 0 1 3 1 1 9 4 0 1 0 3 5 5 5 5 1 4 6 3 1 5 7 5 7 3
サンプル出力
1ケース: 4。 0 0 3。 1。 2 0 1。 5。 1。
Kに等しい間隔を求めて、我々はRセグメントツリーのバージョンを行くことができるクエリの数よりも少ない-セグメントツリーのL-1の番号の最初のバージョン
コード:
#include <cstdioを> する#include <iostreamの> する#include <CStringの> する#include <アルゴリズム> の#include <キュー> の#include <スタック> の#include < セット > の#include <地図> の#include <ベクトル> の#include <cmath> const int型 MAXN = 1E5 + 5 。 typedefの長い長いLL。 使用して名前空間はstdを、 構造体ノード { int型のL、R。 int型の合計。 }ツリー[MAXN * 20 ]。 int型CNT、ルート[MAXN]。 INT [MAXN]。 ベクトル < int型 > V。 INTのgetId(INT X) { 戻り LOWER_BOUND(v.begin()、v.end()、x)は-v.begin()+ 1 。 } ボイドビルド(INT&U、int型の L、INT R) { U = ++ CNT。 ツリー[U] .SUM = 0 。 もし(L == R)のリターン; INT半ば=(L + R)/ 2 。 (ツリー[U] .L、L、中間)を構築します。 (ツリー[U] .R、ミッド構築 + 1を、R)。 } ボイド更新(int型 L、int型の R、int型プリ、INT今&、int型P) { ツリー[ ++ CNT] = ツリー[事前]。 今 = CNT; ツリー[今] .SUM ++ ; もし(L == R) { リターン。 } INT半ば=(L + R)>> 1 。 もし(p <= MID) { 更新(L、中間、ツリー[事前] .L、ツリー[今] .L、P)。 } 他 { 更新(MID +1 、R、ツリー.R、ツリー[今] .R、P [事前])。 } } int型の照会(int型 L、int型の R、int型の L、INT R、int型K) { 場合(L == R) { 戻りツリー[R] .sum- ツリー[L] .SUM。 } INT半ば=(L + R)>> 1 。 もし(K <= MID) { 戻りクエリ(L、中間、ツリー[L] .L、ツリー[R] .L、K)。 } 他 { LL ANS =ツリー[ツリー[R] .L] .sum-ツリー[ツリー[L] .L] .SUM。 ANS + =クエリ(MID + 1、R、ツリー[L] .R、ツリー[R] .R、K); 戻るANSを。 } } int型のmain() { int型T。 CIN >> T; int型、CC = 1 。 一方、(T-- ) { int型N、M。 scanf関数(" %d個の%のD "、&N、&M)。 CNT = 0 ; 用(INT T = 1 ; T <= N T ++ ) { v.clear()。 } のための(INT T = 1 ; T <= N; T ++ ) { scanf関数(" %のD "、&[T])。 v.push_back([T])。 } ソート(v.begin()、v.end())。 v.erase(ユニーク(v.begin()、v.end())、v.end())。 ビルド(ルート[ 0 ]、1 、N) 用(INT T = 1 ; T <= N T ++ ) { 更新(1、nは、ルート[T- 1 ]、根[T]のgetId([T])); } int型のX、Y、K。 printf("ケースは%d:\ N "、CC ++); 一方、(M-- ) { scanf関数(" %D%D%D "、およびX&Y、&K)。 K = UPPER_BOUND(v.begin()、v.end()、K) - v.begin()。 もし(Kの== 0 ) { プット(" 0 " )。 続け; } xは ++ 。 Y ++ ; printf(" %d個の\ n "、クエリ(1、nは、ルート[X- 1]、根[Y]、K))。 } } 戻り 0 。 }