アイデア:
この質問が、それについて少し変化するように、それは、一般的な間隔は、変更とクエリの問題はまだですが、リングにシーケンス。
あなたは、L <Rを入力した場合、変更とクエリが一般的である、およそカテゴリー話。それは環状であるため、しかし、それは実際には、これは2つの1のR LN及び操作缶に分割され、L> Rであろう。
コード、ノーコード、あまりにも多くの水
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 1E6 + 7 。 構造体ノード{ int型のL、R。 長い 長いマイル、怠惰な。 }ツリー[MAXN * 4 ]。 INTのN、M。 ブールスペース。 INT [MAXN]。 int型のL、R。 長い 長いV; インライン長い 長read_long() { スペース = 0 。 登録長い 長 S = 0、W =1 ; 登録チャー C = GETCHAR()。 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ') - W = 1、C = GETCHAR();} 一方(> = C ' 0 ' && cが<= ' 9 ')S =(S << 1)+(S << 3)+ C- 48、C = GETCHAR()。 もし(C == ' ')スペース= 1 。 ワット; } インラインINT read_int() { スペース = 0 。 登録INT S = 0、W = 1 。 登録チャー C = GETCHAR()。 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ') - W = 1、C = GETCHAR();} 一方(> = C ' 0 ' && cが<= ' 9 ')S =(S << 1)+(S << 3)+ C- 48、C = GETCHAR()。 もし(C == ' ')スペース= 1 。 リターンの* ワット。 } ボイドビルド(int型、今int型、LをINT {R) ツリー[今] .L = L、木[今] .R = R。 もし(L == R){ ツリー[今]の.mi = [L]。 返します。 } INT半ば=(L + R)>> 1 。 (今の構築 << 1 、L、ミッド)。 今(ビルド<< 1 | 1、中間+ 1 、R)。 ツリー[今]の.mi =分(ツリー[今<< 1 ]の.mi、ツリー[今<< 1 | 1 ]の.mi)。 } ボイドプッシュダウン(int型今){ 場合(ツリー[今] .lazy){ ツリー[今 << 1 ]の.mi + = ツリー[今] .lazy。 ツリー[今すぐ << 1 | 1 ]の.mi + = ツリー[今] .lazy。 ツリー[今 << 1 ] .lazy + = ツリー[今] .lazy。 ツリー[今すぐ << 1 | 1] .lazy + = ツリー[今] .lazy。 ツリー[今] .lazy = 0 。 } } ボイド更新(int型、今のint L、int型の R、長い 長い{v)の 場合(ツリー[今] .L> = L &&ツリー[今] .R <= R){ ツリー[今]の.mi + = V。 ツリー[今] .lazy + = V; 返します。 } プッシュダウン(今)。 INT半ば=(ツリー[今] .L +ツリー[今] .R)>> 1 。 もし(L <= MID)更新(今<< 1 、L、R、V)。 もし(R> MID)更新(今<< 1 | 1 、L、R、V)。 ツリー[今]の.mi =分(ツリー[今<< 1 ]の.mi、ツリー[今<< 1 | 1 ]の.mi)。 } 長い 長いクエリ(int型今、INT L、INT R){ 場合(ツリー[今] .L> = L &&ツリー[今] .R <= r)は戻りツリー[今]の.mi。 プッシュダウン(今)。 INT半ば=(ツリー[今] .L +ツリー[今] .R)>> 1 。 長い 長い ANS = 1E20; もし(L <= MID)ANS =分(ANS、クエリ(今<< 1 、L、R))。 もし(R> MID)ANS =分(ANS、クエリ(今<< 1 | 1 、L、R))。 戻るANSを。 } int型のmain(){ scanf関数(" %のD "、&N) 以下のために(int型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。 ビルド(1、1 、N) scanf関数(" %のD "、&M)。 以下のために(int型 iは= 1 ; iが<= M iは++ ){ L = read_int(); R = read_int()。 L ++、R ++ 。 もし(空間){ V = read_long()。 場合(L> R){ 更新(1 、L、N、V)。 アップデート(1、1 、R、V)。 } そうでなければ更新(1 、L、R、V)。 } 他{ 場合(L> R)のprintf(" %LLDする\ n "、分(クエリ(1、L、N)、クエリ(1、1 、R)))。 他のprintf(" %LLDの\ nを「、クエリ(1 、L、R))。 } } 戻り 0 。 }