私はトラブルに記述する場合、実際には、各セグメントツリーの反転分布のための唯一のメンテナンス間隔、間隔の割り当てをすることができます。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONSTの INT N =(INT)1E5 + 7 。 INTのN、Q、POS、[N]。 チャーOP [N]。 構造体のビット{ INT [N]。 ボイド変更(int型のx、int型V){ ため(int型 I = xを、iがNを<; I + = I& - I){ [I] + = V。 } } int型の照会(INT X){ int型 ANS = 0 。 以下のために(int型 I = xを、I; I - = I& - i)を{ ANS + = [I]。 } 戻りANS。 } }ビット。 #define LSONリットル、ミッド、室温<< 1つ の#define半ば+ 1、R、RT << 1 rson | 1 構造体SegmentTree { int型 [N << 2 ]、怠惰[<< Nを2、フリップ] [N << 2 ]。 インラインボイドプッシュ(INT RT){ 場合(怠惰[RT]){ [RT << 1 ] = 怠惰[RT]。 アート<< 1 | 1 ] = 怠惰[RT]。 怠惰[RT << 1 ] = 怠惰[RT]。 フリップフロッ[RT << 1 ] = 0 ; 怠惰な[RT << 1 | 1 ] = 怠惰[RT]。 [RT反転 << 1 | 1 ] = 0 ; 怠惰[RT] = 0 ; } もし{([RT]フリップ) [RT << 1 ] = -a [RT << 1 ]。 [RT ;<< 1 | 1 ] = -a [RT << 1 | 1 ]。 もし(レイジー[RT << 1 ])レイジー[RT << 1 ] = -lazy [RT << 1 ]。 他のフリップ[RT << 1 ] ^ = 1 ; もし(怠惰[RT << 1 | 1 ])怠惰な[RT << 1 | 1 ] = -lazy [RT << 1 | 1 ]。 他のフリップ[RT << 1 | 1 ] ^ = 1個の フリップフロッ[RT]= 0 ; } } ボイド更新(int型 L、INT R、int型のVal、INT L、INT R、INT RT){ 場合(R <L || R <L || R <L)のリターン; もし(L <= 1 && R <= R){ [RT] = ヴァル。 怠惰[RT] = ヴァル。 [RT]フリップ = 0 。 返します。 } プッシュ(RT)。 int型ミッド= L + R >> 1 。 アップデート(L、R、ヴァル、LSON)。 アップデート(L、R、ヴァル、rson)。 } ボイドアップデート2(int型 L、INT R、int型の L、INT R、INT RT){ 場合(R <L || R <L || R <L)のリターン; もし(L <= 1 && R <= R){ [RT] = - [RT]。 もし(怠惰[RT])怠惰[RT] = - 怠惰[RT]。 他のフリップ[RT] ^ = 1 ; 返します。 } プッシュ(RT)。 int型ミッド= L + R >>1を、 アップデート2(L、R、LSON)。 アップデート2(L、R、rson)。 } INTクエリ(INT P、int型の L、int型の R、int型RT){ 場合(Lは== R)を返す[RT]。 プッシュ(RT)。 INT半ば= L + R >> 1 。 もし(P <= MID)リターンクエリ(P、LSON)。 他の リターンクエリ(P、rson)。 } }木。 空のショー(){ のために(int型のI =1 ; iが<= N; I ++){ int型 ANS = 0 。 もし([I]!= 0 ){ 場合(ABS([I])> POS)ANS = ABS([I])* Tree.query(ABS([I])、0、100000、1 ); 他の ANS =(bit.query(ABS([i])と)&1)?- [I]:[i]は、 } のprintf(" %d個の%のC "、ANS、" \ n " [I == N])。 } } int型のmain(){ scanf関数(" %D%dの"、&N、&Q); 以下のために(int型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。 POS = 100000 ; 一方、(q-- ){ int型、X scanf関数(" %sの%のD "、OP、およびX) もし(* OP == ' > ' ){ 場合(X> = 0 ){ POS = 分(POS、X)。 Tree.update(X + 1、100000、 - 1、0、100000、1 )。 } 他{ POS =分(POS、-X - 1 )。 Tree.update( -x、100000、 - 1、0、100000、1 )。 Tree.update2(1、-x - 1、0、100000、1 )。 bit.modify(1、1 )。 bit.modify( -x、 -1 ); } } 他{ 場合(X <= 0 ){ POS =分(POS、 - X)。 Tree.update( -x + 1、100000、1、0、100000、1 )。 } 他{ POS =分(POS、X - 1 )。 Tree.update(X、100000、1、0、100000、1)。 Tree.update2(1、X - 1、0、100000、1 )。 bit.modify(1、1 )。 bit.modify(X、 - 1 )。 } } } )(示す図です。 リターン 0 ; } / * * /