する#include <stdio.hに> する#include <ビット/ STDC ++ H> の#define H 100005 名前空間stdを使用。 構造体ノード{int型V、ID;}合計[H]。 INT N、T、P。 ブールCMP(ノードA、ノードB){ IF(AV == BV)戻りa.id <b.id。 AV> BV返します。 } ボイドワーク(){ int型のL、R、ANS、チャ。 L = R =チャ= 1234567890。 両端キュー<整数> Q; 以下のために(; iはi = 0 int型<N =、iは++){ // ながら(!。Q.empty()&&合計[Q.front()] V和[I] .V> = P){ int型K = Q.front(); INT A =分(合計[K] .ID、合計[I] .ID)。 INT B = MAX(合計[k]は、.ID合計[I] .ID)。 INT C =合計[K] .V和[I] .V。 IF(CP <= CHA){ IF(CP == CHA){ IF(== 1)R =最小(R、B)。 他の場合(A <L)L = A、R = B。 ANS = C他、A = L、B = R&LT; チャは、CPを=; } Q.pop_front(); } // Pは差以上である場合に議論 Q.push_back(I) IF(Q.size()=! 1){ Q.front K =を(INT); INT = A分(合計[K]は.ID、合計[I] .ID); int型B = MAX(合計[K]は、合計[I] .IDを.ID ) ;合計C = [K] .V和[I] .V INT IF(PC <= CHA){ IF(PC == CHA){ IF(== 1)R&LT =分(R&LT、B) ; そうでなければIF(<L)、A = L、B = R&LT; } そうANS = C、= L、B = R&LT; チャは、PCを=; } 議論} //差がPに等しい未満である } (printfの" %D D D %% \ N-」、ANS ,. 1 + L、R&LT); } 合計[I] .ID = Iであり; } int型のmain(){ scanfの( "%Dの%のD"、N& 、&T) のための(INT I = 1; Iは= Nを<。I ++){ X INT; scanfの( "%のD"、およびX)、 合計[I] .V =合計[-I 1] .V + X; ソート(合計、合計+ N + 1、CMPは、。);特定の//配列[0、N]並びから連続区間が存在することになるので、[1、i]はの 一方(T - ){ scanfの( "%のD"、P&); ワーク(); } }