最も値の最大数(点変化、

問題の意味

唯一の初期番号は、最大のシーケンス番号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      ビルド(11 、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 }

 

おすすめ

転載: www.cnblogs.com/hhyx/p/12459979.html