最初のコードを入れていつものように、私は変更することが開始していません...
書式#include <iostreamの> の#include <cstdioを> 使用して 名前空間はstdを、 int型M、Q、KK、VV。 構造体ノード{ int型K、V。 } [ 200010 ]。 構造体ツリー{ int型のL、R、和、PI、VI。 } B [ 800010 ]。 INTの作業(INT P、INT V){ もし、(B [P * 2 + 1 ]、π< V){ 戻り作業(P * 2、VB [P * 2 + 1 ]、π+ B [P * 2 + 1] .vi)。 } そう であれば(B [P * 2 + 1 ]、π== V){ 戻り B [P] .SUM-B [P * 2 + 1 ] .SUM。 } 他{ 戻り B [P] .SUM-B [P * 2 + 1 ] + .SUMワーク(P * 2 + 1 、V)。 } } ボイド更新(INT P){ 場合(!B [P * 2 + 1 ] .vi){ B [P] .SUM = [P * B 2 ] .SUM + B [P * 2 + 1] .SUM。 B [P] .vi = B [P * 2 + 1 ] .vi + B [P * 2 ] .vi。 B [P]、π = B [P * 2 ] +、πのB [P * 2 + 1 ]、π。 } そうで あれば(B [P * 2 + 1 ] .vi> = bの[P * 2 ]、π){ B [P] .SUM = [P * B 2 + 1 ] .SUM。 B [P]、π = B [P * 2 + 1 ]、π。 B [P] .vi = B [P * 2 + 1 ] .vi-B [P * 2 ] +、πのB [P * 2] .vi。 } エルス{ B [P] .SUM = [P * B 2 + 1 ] + .SUMワーク(P * 2、B [P * 2 + 1 ] .vi) B [P]、π = B [P * 2 + 1 ]、π+ B [P * 2 ]、πのB [P * 2 + 1 ] .vi。 B [P] .vi = B [P * 2 ] .vi。 } } ボイドビルド(もし pが、あなたがしている、あなたがR){ B [P]【選択 = L、B [P] .R = R。 OW(L == R){ もし(! [L]・K){ B [P] .SUM = [L] .V。 B [P]、π = 1、B [P] .vi = 0 。 } 他{ B [P] .SUM = 0 。 B [P]、π = 0 。 B [P] .vi = A [L] .V。 } を返します。 } INT半ば=(L + R)/ 2 。 構築した(p * 2 、L、ミッド)。 構築した(p * 2 + 1、ミッド+ 1回、r)を、 の更新(P); } ボイド変化(int型 P、int型の L、int型R){ 場合(L <= bの[P] .L && B [P] .R <= R){ 場合(!KK){ B [P] .SUM = VV。 B [P]、π = 1、B [P] .vi = 0 。 } 他{ B [P] .SUM = 0 。 B [P]、π = 0 。 B [P] .vi = VV。 } を返します。 } INT半ば=(B [P] .L + B [P] .R)/ 2 。 もし(L <= MID)変化(P * 2 、L、R)。 もし(R> MID)変化(P * 2 + 1 、L、R)。 更新(P)。 } int型のmain() { // freopenは( "3.in"、 "R"、STDIN)。 // freopenは( "3.out"、 "W"、STDOUT)。 scanf関数(" %dの%のD "、&M&Q)。 用(int型 I = 1、K、V、iは<= M; iは++ ){ scanf関数(" %d個の%のD "、&を[I]・K、&[I] .V)。1、、M)。 一方、(q-- ){ int型C。 scanf関数(" %D%D%D "、&C&KK、&VV)。 変化(1 、C、C)。 printf(" %Dを\ n "、B [ 1 ] .SUM)。 } 戻り 0 。 }