ツリーラインとメンテナンス間隔とフラグがマーク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 ビルド(1、1 、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!)1、1 、N、L、R)。 49 他のprintf(" %のLLD \ n "、クエリ(1、1 、N、L、R))。 50 } 51 }