質問が意図される:クエリコンテンツ問合せ間隔を満たす長さn回Mのシーケンスを構築するL-> R&W値
アイデア:| push_up更新でW&その後、間隔の値のは、それが直接の問い合わせのための条件との和[RT]を満たすようにしてみましょう
すべてのお問い合わせを更新した後、我々はそれが再び各チャレンジを満たすことができるかどうかを確認するために戻って
1 OOO白WA |私は通常、マクロ定義されLSONのrsonを書き込み、再帰間隔RT 1、RT及びませんが、<< << 1を書くとき、今日、この質問について書く非常にシンプルですが練習試合、この質問4回
#include <ビット/ STDC ++ H> の#defineは長い長いちゃう の#define LSONのL、M、RT << 1つ の#define rsonのM + 1、R、RT << 1 | 1 使用して 名前空間STDを、 const int型 MAXN = 100005 ; int型の合計[MAXN << 2 ]、怠惰な[MAXN << 2 ]。 ボイド push_up(INT RT){ 和[RT] =和[RT << 1 ]&和[RT << 1 | 1 ]。 } ボイド push_down(INT RT){ 場合(怠惰[RT]){ 怠惰[RT << 1] | = 怠惰[RT]。 怠惰な[RT << 1 | 1 ] | = 怠惰[RT]。 合計[RT << 1 ] | = 怠惰[RT]。 合計[RT << 1 | 1 ] | = 怠惰[RT]。 怠惰[RT] = 0 ; } } ボイド更新(int型 L、INT R、int型 RT、INT L、INT R、INT ヴァル){ 場合(L <= 1 && R <= R){ 和[RT] | =ヴァル。 怠惰[RT] | = ヴァル; 返します。 } push_down(RT)。 INT、M =(L + R)>> 1 。 もし(L <= m)の更新(LSON、L、R、ヴァル)。 もし(R> m)の更新(rson、L、R、ヴァル)。 push_up(RT)。 } int型のFG。 ボイドクエリ(int型 L、INT R、int型 RT、INT L、INT R){ 場合(L <= 1 && R <= R){ FG&= 和[RT]。 返します。 } push_down(RT)。 int型、M =(L + R)>>1を、 もし(L <= M)クエリ(LSON、L、R)。 もし(R> M)クエリ(rson、L、R)。 push_up(RT)。 } int型U [MAXNを]、V [MAXN]、[MAXN] W。 ボイドゴー(int型 L、INT R、int型 RT、INT L、INT R){ 場合(L == R){ COUT <<和[RT] << " " 。 返します。 } push_down(RT)。 INT、M =(L + R)>> 1 。 (LSON、L、R)に行きます。 (rson、L、R)に行きます。 } int型{main()の int型、N M。 scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 I = 1 ; I <= M; iは++ ){ scanf関数(" %D%D%D "、およびU [i]は、&V [i]は、&W [I])。 アップデート(1、nは、1 、U [i]は、V [I]、W [I])。 } のために(int型 I = 1 ; I <= M; iは++ ){ FG =(1 << 30) - 1 。 クエリ(1、nは、1 、U [i]は、V [I])。 もし(FG =![I] W){ プット(" NO " )。 リターン 0 ; } } プット(" YES " ); (行く1を、nは、1、1 、n)は、 リターン 0 ; }