コード:
#include <ビット/ STDC ++。H> に#define setIO(S)freopenは(S ".IN"、 "R"、STDIN) の#define MAXN 10000000件 の#define LS(X << 1) の#define RS((X << 1)| 1) の#define中間((L + R)>> 1) 名前空間stdを使用。 構造体Q { int型のL、R、NUM。 ブール演算子<(Q E)のconst { 戻りR == ER L?> EL:ER <R。 } }、Q [MAXN]。 int型K、N、C。 int型MAXV [MAXN]、怠惰[MAXN]。 ボイド押し上げ(INT X) { MAXV [X] = MAX(MAXV [LS]、MAXV [RS])。 } ボイドマーク(int型のx、int型デルタ) { 怠惰[X] + =デルタ、MAXV [X] + =デルタ。 } ボイドプッシュダウン(int型L、int型のR、 { { IF(中間> = 1)マーク(LS、怠惰[X])。 IF(中間+ 1 <= r)とマーク(RS、怠惰[X])。 ; [X] = 0怠惰 } } int型の照会(int型L、int型のR、int型のx、int型のL、int型R) { IF(L> = L && R <= R)MAXV [X]を返します。 プッシュダウン(L、R、X)。 int型、T = 0; IF(L <= MID)T =クエリ(L、中間、LS、L、R)。 IF(R> MID)T = MAX(T、クエリ(MID + 1、R、RS、L、R)); トンを返します。 } ボイド更新(int型L、int型のR、int型のx、int型のL、R INT、INTデルタ) { プッシュダウン(L、R、X)。 (L> = L && R <= R)であれば { マーク(X、デルタ); 返します。 } IF(L <= MID)更新(L、中間、LS、L、R、デルタ); IF(R> MID)更新(MID + 1、R、RS、L、R、 突き上げ(X)。 } int型のmain() { // setIO( "入力")。 scanf関数(」 scanf関数( "%D%D%D"、&Q [i]は.L&Q [i]を.R&Q [i]の.num);(;私は= Kを<++ I iは1 = INT)のために ソート(Q + 1、Q + 1 + K)。 int型ANS = 0; 以下のために(; iは= Kを<; I = int型1 ++ I) { int型TMP =クエリ(1、nは、1、Q [i]は.L、Q [i]は.R-1)。 ANS + =分(Q [i]が.num、C - TMP)。 アップデート(1、nは、1、Q [i]は.L、Q [i]は.R-1、分(Q [i]が.num、C - TMP))。 } のprintf( "%d個の\ n"、ANS)。 0を返します。 }