#問題の意味
唯一の初期番号は、最大のシーケンス番号L後クエリQの動作を示すmは、tは数プラス系列長がn + 1となる表し、mは
数は、クエリの値であり、(T + A)MOD pを添加します
#説明
セグメントツリー動作のみプロパティを更新することが、さらに配列値前のクエリの数を記録することができ
1の#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 CONST INT N = 2E5 + 10 。 4 構造体ノード{ 5 int型のL、R。 6 INT V; 7 } TR [ 4 * N]。 8 9インラインボイド push_up(INT U){ // 从下向上更新信息 10 TR [U] .V = MAX(TR [U << 1 ] .V、TR [U << 1 | 1 ] .V)。 11 } 12 // 空隙push_down(INT U){// 遅延マーカーは、下方更新から 13である 14 // } 15インラインボイドビルド(INT U、INT L、INT R&LT){ 16 TR [U] .L = L、TR [U] .R = R&LT; 17 IF(L == R&LT){ 18は リターン; 19 } 20は、 int型 MID = L + R&LT >> 1 ; 21である ビルド(U << 1 、L、MID) 22は 、ビルド(U << 1 | 1、MID + 。1 、 R&LT); 23である } 24インライン空隙変化(INT U、int型のx、int型 V){ // 单点修改将[X]值改为V 25 であれば(TR [U] .L == X && TR [U] .R == X) { 26 TR [U] .V = V。 27 } 28 他{ 29 INTミッド= TR [U] .L + TR [U] .R >> 1 。 30 であれば(X <= MID)変化(U << 1 、X、V)。 31 他の変更(U << 1 | 1 、X、V); 32 push_up(U)。 33 } 34 } 35インラインINT ASK(INT U、INT Lを、INT R&LT){ 36 IF(TR [U] .L> && TR = L [U] .R <= R&LT)戻りTR [U] .V; 37 [ INT MID = TR [U] .L + TR [U] .R >> 1 ; 38である INT V = 0 ; // 負の無限大 39 IF(L <= MID)// の右側に左点の中点 40 V = ASK(U << 図1は、L、R&LT)、 41は IF(R&LT> MID)// 上右点における中点は左 42が V maxの=(V、ASK(U << 1 | 1 、L、R&LT)); 43であります リターンV; 44 } 45 のint M、P。 46 INT メイン(){ 47 CIN >> M >> P。 48 INT、N = 0、最後= 0 。 49 ビルド(1、1 、M); 50 int型のX; 51 列OP。 52 一方(M-- ){ 53 CIN >> OP >> X。 54 場合(OP [ 0 ] == ' Q ' ){ 55 最後=は(ASK1、N-X + 1 、N)。 56 coutの<<最後<< てendl; 57 } 58 他{ 59 変化(1、N + 1、(X +最後)%のP)。 60 N ++ 。 61 } 62 } 63 64 }