:セグメントの数を持つ2つのセクションの期間内にメンテナンス情報 1. あなたがアップグレードを作ることができる人を持っている必要がありますどのように多くの経験、2 年生と。単一のポイントは間隔、直接暴力を行うアップグレードがマークされますが、再帰怠惰マークされていない場合は、このセクションは考慮されません修正するために変更することができます。
時間複雑さを考慮してください一点変更時間複雑である$ O(LOG_ {2} N-)$それぞれは、n + Qアップグレードまで時点から、および間隔修正総時間の複雑さには、$ O((あります+ QのN-)LOG_ mを{2})$ 、あなたがつながることができます。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define N 1000001 4 の#define L(K << 1) 5 の#define R(L + 1) 6 の#define中間(L + R >> 1) 7 のint N、M、Q、P、X、Y、 Z、MI [N]、F [N]、怠惰[N]、[N]。 8 ボイドアップ(int型K){ 9 F [K] = F [L] + F [R]。 10 マイル[K] = 分(MI [L]、MI [R])。 11 } 12 ボイドダウン(int型K){ 13 怠惰[L] + = 怠惰[K]。 14 MI [L] - = 怠惰[K]。 15 怠惰[R] + = 怠惰[K]。 16 マイル[R] - = 怠惰[K]。 17 怠惰[K] = 0 ; 18 } 19 空隙更新(int型 K、int型の L、int型の R、int型のx、int型の Y、int型Z){ 20 であれば((L> Y)||(X> R))のリターン; 21 であれば((X <= 1)&&(R <= Y)){ 22 マイル[K] - = Z。 23 であれば(MI [K]> 0 ){ 24 怠惰[K] + = Z。 25 リターン; 26 } 27 であれば(L == R){ 28 マイル[K] - [K] + [F = 1 ]。 29 F [K] = UPPER_BOUND(A + 1、+のM + 1、-mi [K]) - A- 1 。 30 マイル[K] + = [K] + [F 1 ]。 31 リターン; 32 } 33 } 34 ダウン(K)。 35 更新(L、L、中、X、Y、Z)。 36 更新(R、中間+ 1 、R、X、Y、Z)。 37 (k)をアップ。 38 } 39 空隙更新(int型 K、int型の L、int型の R、int型のx、int型のY){ 40 であれば(L == R){ 41 F [K] = UPPER_BOUND(A + 1、+のM + 1、Y) - A- 1 。 42 マイル[k]は[F [K] + = 1 ] - yは、 43 リターン; 44 } 45 ダウン(K)。 46 であれば(X <= アップデート(L、L、中、x、y)の中間)。 47 他に更新(R、ミッド+1 、R、X、Y)。 48 アップ(K)。 49 } 50 INTクエリ(INT K、int型の L、int型の R、int型のx、int型Y){ 51 であれば((L> Y)||(X> R))戻り 0 ; 52 であれば((X <= 1)&&(R <= Y))リターン[K] F。 53 ダウン(K)。 54 リターンクエリ(L、L、中、X、Y)+クエリ(R、中間+ 1 、R、X、Y)。 55 } 56 int型のmain(){ 57 のscanf(" %D%D%D "、&N、&M&Q)。 58 のために(int型 I = 1 ; I <= M; iが++)のscanf(" %dの"、および[I])を、 59 [M + 1 ] = 0x3f3f3f3f 。 60 のためには、(int型 i = 1 ; iが<= N; iが++ ){ 61 のscanf(" %dの"、およびX) 62 更新(1、1 、N、I、X)。 63 } 64 のための(int型 I = 1 ; I <= Q; iは++ ){ 65 のscanf(" %D%D%D "、&P、およびX&Y)。 66 もし(Pの== 1 ){ 67 のscanf(" %dの"、&Z)。 68 更新(1、1 、nは、X、Y、Z)。 69 } 70 であれば(のp == 2)更新(1、1 、nは、X、Y) 71 であれば(のp == 3)のprintf(" %d個の\ n "、クエリ(1、1 、nは、X、Y))。 72 } 73 }