質問の意味:あなたのn * mの行列を与えるためには、あなたが一つだけがユニットを反転するように要求された2つのQ回(あなたは歩行が利用できないが、離れて行く利用できるようになるになって行くことはできません)があります下デッキで動作することができます左から右へどのように多くのプログラムもうから依頼することである(1、x)は(Y、N)来
アイデア:時間解を計算するの数に相当する場合タイトル1E5およびnは10メートルであるが、我々は、動作は、単一点の更新に相当する変更(手動で何をシミュレートするために)のM * Mマトリックスアナログマトリックス乗算を維持するために、ツリー線分を考慮することができます次いで、再構成マトリクス
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONSTの INT N = 5E4 + 7 。 const int型 INF = 0x3f3f3f3f 。 typedefの長い 長いLL。 CONST LL MOD = 1E9 + 7 。 LL [N] [ 12 ]。 INTのN、M、Q。 構造体行列{ int型のL、R。 LLのMA [ 12 ] [ 12 ]。 }。 行列T [N << 2 ]。 ボイド押し上げ(int型P){ のmemset(T [P] .ma、0、はsizeof (T [P] .ma))。 以下のために(int型 iは= 1 ; I <= M I ++ ) のための(INT J = 1 ; J <= Mであり、j ++ ) のための(INT K = 1 k個++; K <= M ){ [T [P] .maをI] [J] =(T [P] .ma [I] [J] +((T [P << 1 ] .ma [I] [K]%のMOD)*(T [P << 1 | 1 ] .ma [K] [J]%のMOD))%のMOD)%MOD。 } } ボイドワーク(INT P、int型L){ memsetの(T [P] .ma、0、sizeof (T [P] .ma))。 以下のために(int型 I = 1 ; I <= M; iは++ ){ int型の POS = I。 一方(POS> = 1 && [L] [POS] == 0 ){ T [P] .ma [I] [POS] = 1 。 POS - ; } POS = I。 一方(POS <= M && [L] [POS] == 0 ){ T [P] .ma [I] [POS] = 1 。 POS ++ ; } } } のボイド(ビルドINT P、int型の L、INT R){ T [P] .L =リットル; T [P] .R = R。 もし(L == R){ ワーク(P、L)。 返します。 } INT半ば=(L + R)>> 1 。 構築した(p << 1 、L、ミッド)。 構築した(p << 1 | 1、ミッド+ 1 、R); 突き上げ(P); } ボイド更新(INT P、INT X){ もし(T [P] == .L Tを[P] .R){ ワーク(P、T [P] .L)。 返します。 } INT半ば=(T [P] .L + T [P] .R)>> 1 。 もし(x <= MID)更新(P << 1 、X)。 他の更新(P << 1 | 1 、x)は、 突き上げ(P); } int型のmain(){ IOS :: sync_with_stdio(偽)。 cin.tie(0)。cout.tie(0 )。 CIN >> N >> M >> Q。 以下のために(int型 i = 1 ; iが<= N; iが++ ){ ため(INT J = 1 ; J <= M; J ++){ char型の B; cinを>> B; [I] [J] =(B =!' 0 ' ); } } ビルド(1、1 、N) 以下のために(int型 I = 1 ; I <= Q; I ++ ){ int型 Z、X、Y。CIN >> Z >> X >> Y。 もし(Zの== 1 ){ [X] [Y] ^ = 1 ; アップデート(1 、x)は、 } 他{ COUT << T [ 1 ] .ma [X] [Y] << " \ nを " ; } } 戻り 0 。 }