タイトル説明
今、列の数を維持するためにあなたを要求し、それは、次の2つのアクションを必要とします。
1、クエリ操作。
構文:Q L
機能:現在の数のLの列数の最後にクエリの最大数は、この数の値を出力します。
制限事項:LのLは、現在のシーケンスの長さを超えてはなりません。(L> 0) (L > 0 )
図2に示すように、挿入操作。
構文:A n
関数:N- n型プラスT T、T Tは、最後のクエリ操作に対する回答である(既にクエリ操作を行っていない場合、T = 0 T = 0)、固定定数の結果D 取らD 、列数の末尾に挿入された結果の答えを死にます。
制限:N- nは整数(おそらく負)と全長の範囲です。
注意:列の数は数ではなく、最初は空です。
入出力フォーマット
入力フォーマット:
2つの整数の最初の行M M及びD D、M Mは、操作の数を表し(M \ル20万)(M ≤ 2 0 0 、0 0 0 )、D Dは満足、上述(0 < D <2,000,000,000) (0 < D < 2 、0 0 0 、0 0 0 、0 0 0 )
次のM M行、各行具体的な動作を説明する文字列。構文は、上記のように。
出力フォーマット:
各クエリについて、あなたは順番に出力し、各結果の行を有効にしてください。
トピック要件あまりにもストレートボール
#include <ビット/ STDC ++ H> の#defineは長い長いllの 使用 名前空間STDを、 const int型 MAXN = 2E5 + 5 。 int型のn; LL [MAXN]、D。 構造体ノード { int型のL、R。 LLのID。 } T [MAXN * 4 ]。 ボイドビルド(int型 P、int型の L、INT R) { T [P] .L = L、T [P] .R = R。 もし(L == R) { T [P] .ID = [L]。 リターン。 } INT半ば=(L + R)>> 1 。 構築した(p * 2 、L、ミッド)。 (Pビルド * 2 + 1、ミッド+ 1 、r)を、 T [P] .ID = maxが(T [P * 2 ] T [P *、.ID 2 + 1 ] .ID)。 } ボイド変化(int型 P、INT X、LLのV、INTを L、INT R) { 場合(L == R) { T [P] .ID = V。 返します。 } int型半ば=(L + R)>> 1 。 もし(x <= MID) 変化(のp * 2 、X、V、L、MID)。 他の 変化(P * 2 + 1、X、V、中間+ 1 、R)。 T [P] .ID = maxが(T [P * 2 ] T [P *、.ID 2 + 1 ] .ID)。 } (ASK llの整数 L0、INT R0、INT P、INT L、int型R) { 場合(L <= L0 && R> = R0) { 戻りT [P] .ID。 } int型半ば=(L0 + R0)>> 1 。 LLヴァル = - (1 << 30 )。 場合(中期> = リットル) のval = MAX(ヴァル、(L0、ミッド、P *を尋ねる2 、L、R))を、 もし(MID < R) ヴァル = MAX(ヴァル、(MID +尋ねる1、R0、P * 2 + 1 、L、R))を、 返すのvalを。 } int型のmain() { scanf関数(" %d個の%のLLD "、&N、&D)。 int型のlen = 0 ; LL T = 0 。 用( int型i = 1 ; iは= <N; iは++ ) { チャーCH。 LLのx; scanf関数(" %のCの%のLLD "、およびCH、およびX)。 // coutの<< CH <<」「<< X <<てendl; もし(CH == ' A ' ) { 変化(1、++ LEN、(X + T)%のD、1 、N) } 他 { 場合(X == 0 ) 、T = 0 。 他の T =(尋ねる1、、n個、lenの-X + 1 、LEN)。 printf(" %LLDする\ n " 、T)。 } } 戻り 0 。 }