[Bzoj3038] 7 Fenzhong神は2のテーマを作りました

ツリーラインとメンテナンス間隔とフラグがマーク1の場合ではない範囲、全てが1であるか否かを示す、および変更するように、上であろう約6倍にそれぞれ開放位置を考慮し、動作は意味をなさない暴力が続く、1が動作しない、複雑さは(6nlogn)O $ $です

1の#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#define N 100005
 4  の#defineっ長い長い
 5  の#define L(K << 1)
 6  の#define R(L + 1)
 7  の#define中間(L + R >> 1)
 8  整数 N、M、P、 L、R、Lazの[N << 2 ]。
9 [N << F LL 2 ]。
10  ボイドアップ(int型K){
 11      のLaz [K] =(Lazの[L]およびLazの[R])。
12      F [K] = F [L] + F [R]。 
13  }
 14 ボイドビルド(int型 K、INT L、int型R){
 15      であれば(L == R){
 16          のscanf(" %のLLD "、&F [K])。
17          であれば(F [K] == 1)のLaz [K] = 1 18          リターン;
19      }
 20      ビルド(L、L、MID)。
21      ビルド(R、中間+ 1 、R)。
22      アップ(K)。
23  }
 24  空隙更新(INT K、INT L、INTR、int型のx、int型のY){
 25      であれば((L> Y)||(X> R))のリターン;
26      であれば((X <= 1)&&(R <= Y)&&(Lazの[K]))のリターン;
27      であれば(L == R){
 28          F [K] = (LL)SQRT(F [K])。
29          であれば(F [K] == 1)のLaz [K] = 1 30          リターン;
31      }
 32      更新(L、L、中、X、Y)
33      更新(R、中間+ 1 、R、X、Y)。
34      アップ(K)。
35  }
 36 LLクエリ(int型 K、int型の L、int型の R、int型のx、int型のY){
 37      であれば((L> Y)||(X> R))戻り 0 ;
38      であれば((X <= 1)&&(R <= Y))リターン[K] F。
39      リターンクエリ(L、L、中、X、Y)+クエリ(R、中間+ 1 、R、X、Y)。
40  }
 41  、INT (){主
 42      のscanf(" %d個"、&N)
43      ビルド(11 、N)
44      のscanf(" %dの"、&M)。
45      のためにINT iは= 1 ; iが<= M; I ++ ){
 46          のscanf(" %D%D%D "、&​​P&L&R)。
47          場合(L> R)スワップ(L、R)。
48          であれば更新((P!)11 、N、L、R)。
49          のprintf(" %のLLD \ n "、クエリ(11 、N、L、R))。
50      }
 51 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/PYWBKTDA/p/11828868.html