1の#include <cstdioを> 2の#include <アルゴリズム> 3 使用して 名前空間をSTD。 4 CONST INT MAXN = 1E5 + 10 。 5 構造体ノード{ INT L、R、怠惰、色;} T [MAXN * 4 ]。 6 INT L、R、C、N、M、Q。 7つ の#define LS T [X] .L 8 の#define RS T [X] .R 9 INTカウント(INT X){ int型 ANS = 0。用(; X; X >> = 1)であれば(X&1)++ ANS; リターンANS;} 10 空隙プッシュダウン(int型 X){ もし(T [X] .lazy)T [LS] .lazy = T [RS] .lazy = T [LS] .color = T [RS] .color = T [X] .lazy、T [X] .lazy = 0 ;} 11 空隙更新(INT X){T [X] .color = T [LS] .color | T [RS] .color;} 12 空隙ビルド(int型のx、int型の L、int型R){ 13 であれば(L == R){T [X] .color = 1。リターン;} 14 int型ミッド=(L + R)>> 1 ; T [X] .L =(X << 1)、T [X] .R =(X << 1 |1 ); 15 ビルド(LS、L、MID)、ビルド(RS、ミッド+ 1 、R)、更新(X)。 16 } 17 空隙更新(int型のx、int型の L、int型R){ 18 であれば(L <= L && R <= R){T [X] .color = T [X] .lazy = 1 <<(C- 1) ; リターン;} 19 プッシュダウン(X)。INTの半ば=(L + R)>> 1 。 20 であれば(L <= MID)更新(LS、L、MID)。 21 であれば(R> MID)更新(RS、ミッド+ 1 、R)。 22 更新(X) 23 } 24 int型の照会(int型のx、int型の L、int型R){ 25 であれば(L <= L && R <= R)戻りT [X] .color。 26 プッシュダウン(X)。INT半ば=(L + R)>> 1、ANS = 0 。 27 であれば(L <= MID)ANS | = クエリ(LS、L、MID)。 28の 場合(R>中間)はANS | =クエリ(RS、ミッド+ 1 、R)。 29の リターンANS; 30 } 31 INT メイン(){ 32 のscanf(" %D%D%D "、&N、&M&Q)、ビルド(1、1 、N) 33 のための(int型 ; q-- A、B {;) 34 CHAR S [ 2 ]; scanf関数(" %S " 、S)。 35 であれば(S [ 0 ] == ' C ')のscanf(" %D%D%D "、&、&B、&C)、L =分(a、b)は、R = MAX(a、b)は、更新(1、1 、N) 36 他のscanf(" %D%D "、&、&B)、L =分(a、b)は、R =(a、b)はMAX、のprintf(" %D \ n "、カウント(クエリ(1、1、N)))。 37 } 38 リターン 0 。 39 }