夜の試合エレン(Atcoder&codeforces)、プラス学校の試験の見直しとして、我々は書く時間がありません。
ブロックコードはO(n√n)、バレーを掲示し、ロスCFが渡されますが、過去のごみbzojカードでは、変わっていないではありません。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONSTの INT N = 1E5 + 7 。 INTの N、M、B、B [N]、[N]、POS [N]、L [N]、R [N]、FA [N]、MX [N]、合計[N]、C [ 320 ] [N]、タグ[N]。 int型の検索(INT X){ 戻り X == FA [x]はx:FA [X] = (FA [X])を見つける;} ボイドビルド(int型のID)を { ため(int型 I = 1 [ID];私<= R [ID]; iが++)[I] = bの[(I)検索]、C [ID] [I] = 0 ; 以下のために(int型 I = 1 [ID]; I <= R [ID]; iは++)FA [I] = I、和[I] = 1 。 以下のための(int型I = 1 [ID]; I <= R [ID]; iが++ ) 場合(C [ID] [I])C [ID] [I] = I、B [I] =!A [私]; 他和[C [ID] [I]]] + =和[i]は、FA [I] =のC [ID] [I]]。 一方 MX [ID](C [ID] [MX [ID]]!) - 。 } ボイド更新(int型 ID、int型のx、int型の Y、INT V) { ため(int型 I = 1 [ID]; I <= R [ID]; iが++)[I] =のB [(I)検索]。 以下のために(int型 I = 1 [ID]; I <= R [ID]; iは++)C [ID] [I] = 0 ; 用(int型私は++; iが= yと<I = xを)場合(B [(I)検索] -タグ[ID]> V)[1] - = V。 用(int型 B [i]は[I] =、FA [I] =; I <= R [ID] I ++は、I = 1 [ID])I。 (ID)を構築します。 } ボイド(変更int型のx、int型、YをINT V) { 場合(POS [X] == POS [Y]){更新(POS [X]は、X、Y、V)。返す;} 更新(POS [X]は、X、R [POS [X]]、V)、更新(POS [Y]、L [POS [Y]、Y、V)。 以下のために(int型 I = POS [X] + 1 ; iは++; iがPOS [Y < ) 場合(V <MX [I] -tag [I] && MX [I] -tag [i]が< 2 * V) { ために(INT J =タグ[I] + V +1 ; J <= MX [I]; J ++ ) 場合(C [I] [J]) であれば(C [I] [JV])C [i]は[JV] = Cを[I]、[J]、B! [C [I] [J] = JV、C [I] [J] = 0 ; 他の FA [i]の[j]をC [i]の[j]をC] = Cの[i]の[JV]、合計[C [i]の[JV]] + =合計、[[I] [J] C] = 0 ; しばらく(!C [i]の[MX [I]])MX [i]は- 。 } そう であれば(MX [I] -tag [I]> = 2 * V) { ため(INT J =タグ[I] + 1 ; J <=タグ[I] + V; J ++ ) 場合(C [I] [J]) であれば(!C [I] [J + V])C [I] [J + V] = Cを[I]、[J]、B [C [I] [J] = J + V、 C [I] [J] = 0; 他の FA = cは、[I] [J + V]、合計[C [i]の[J + V]] + =合計[[I] [J] C]、I [C [i]の[j]をC] ] [J] = 0 ; タグ[I] + = V。 } } int型の照会(int型のx、int型の Y、INT V) { int型 RET = 0 。 場合(POS [X] == POS [Y]) { ためには、(int型 I = xを、私は= yと<; I ++の)場合(B [見つける(I)] -タグ[POS [I]] == V)RET ++ ; リターンRET; } のための(int型 I = xを、I <= R [POS [X]]; iは++)場合(B [検索(I)] -タグ[POS [I]] == V)RET ++ 。 用(int型 ; iは= yと<I ++は、I = 1 [POS [Y])場合(Bは[(I)検索] -タグ[POS [I]] == V)RETを++ 。 以下のために(int型 I = POS [X] + 1 ; iはPOS [Y <; iは++)の場合(V +タグ[i]は<N)RET + =合計[C [i]と[V + タグ[I]]]。 リターンRET; } int型のmain() { scanf関数(" %d個の%のD "、&N、&M)、Bは= SQRT(N)。 以下のために(int型 i = 1 ; iが<= N; iは++)(scanf関数を" %のD "、&[i])と、[i]は= B [i]は、FA [I] = I。 にとって(int型 i = 1 ; iがn = <; iは++ ) { R [POS [I] =(I- 1)/ B + 1 ] = I。 もし(!L [POS [I])L [POS [I] = I。 } のために(int型 i = 1 ; iが= POSを<n]は、iが++)MX [I] = 1E5、(i)を構築します。 一方、(M-- ) { int型の OP、X、Y、V; scanf関数(" %D%D%D%D "、&OP、およびX&Y、およびV)。 場合(オペアンプ== 1)変更(X、Y、V)。他のprintf(" %d個の\ nを"、クエリ(X、Y、V))。 } }