見つけるためにシングルポイント更新間隔、セグメントツリーモジュロ演算、二つの配列、最大電流メンテナンス間隔を維持するために、現在の間隔を維持し、最大値がMOD未満であれば、モジュロダウンがもはや存在し:問題の意味通常の操作〜;;;
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include < 文字列 > 使用して 名前空間はstdを、 const int型 MAXN = 1E5 + 10 。 const int型 INF = 0x3f3f3f3f 。 typedefの長い 長いLL。 LL [MAXN]、ツリー[MAXN * 4 ]、怠惰[MAXN * 4 ]。 LL maxtree [MAXN * 4 ]。 ボイドビルド(int型 L、int型の R、INT 今){ もし(L == R){ ツリー[今] = maxtree [今]は= [L]を、 返します。 } INT半ば=(L + R)>> 1 。 構築(今リットル、ミッド、 << 1 )。 構築(ミッド + 1今、R、<< 1 | 1 ); ツリー[今]ツリー[今すぐ<< = 1 ] +ツリー[今すぐ<< 1 | 1 ]。 maxtree [今] = MAX(maxtree [今<< 1 ]、maxtree [今<< 1 | 1 ])。 } ボイド O3(int型 L、INTR、int型、今のint K、LL秒){ 場合(L == R){ ツリー[今] =のS。 maxtree [今] =のS。 返します。 } INT半ば=(L + R)>> 1 。 もし(MID> = K)O 3(L、中間、今<< 1 、K、S)。 他の O3(ミッド+ 1、R、今や<< 1 | 1 、K、S); ツリー[今]ツリー[今すぐ<< = 1 ] +ツリー[今すぐ<< 1 | 1 ]。 maxtree [今] = MAX(maxtree [今<< 1]、maxtree [今すぐ<< 1 | 1 ])。 } ボイド O2(int型 L、int型の R、int型今、int型の L、int型の R、int型の){ 場合(S> maxtree [今])を返します。 もし(L == R){ ツリー[今]%の=のS。 maxtree [今]%の=のS。 返します。 } INT半ば=(L + R)>> 1 。 もし(MID> = L)O 2(L、中間、今<< 1 、L、R、S)。 もし(ミッド<R)O2(ミッド+1今、R、<< 1 | 1 、L、R、S)。 ツリー[今]ツリー[今すぐ<< = 1 ] +ツリー[今すぐ<< 1 | 1 ]。 maxtree [今] = MAX(maxtree [今<< 1 ]、maxtree [今<< 1 | 1 ])。 } LL O1(int型 L、int型の rは、int型、今のint L、int型R){ 場合(L> = L && R <= R){ 戻りツリー[今]。 } INT半ば=(L + R)>> 1 。 LL和 = 0; もし(L <= MID)の和+ = O1(L、中間、今<< 1 、L、R)。 もし(R> MID)合計+ = O1(MID + 1、R、今<< 1 | 1 、L、R)。 戻り値の合計。 } int型のmain(){ IOS :: sync_with_stdio(偽)。 INTのN、M。 CIN >> N >> M。 以下のために(int型 i = 1 ; iが= <N; iは++)CIN >> [I]。 (ビルド1、nは、1 )。 一方、(M-- ){ int型のLL C; OP、X、Y、 CIN>> オペアンプ; もし(OPの== 1 ){ CIN >> X >> Y。 COUT << O1(1、nは、1、X、Y)<< ENDL。 } そう であれば(OP == 2 ){ CIN >> X >> Y >> C。 O2(1、nは、1 、X、Y、C)。 } 他{ CIN >> X >> C。 O3(1、nは、1 、X、C)。 } } 戻り 0 。 }