给定一个正整数数列 a1,a2,a3,....a[n],每一个数都在 0∼p–1之间。可以对这列数进行两种操作:

添加操作:向序列后添加一个数,序列长度变成 n+1

询问操作:询问这个序列中最后 m个数中最大的数是多少。

程序运行的最开始,整数序列为空。写一个程序,读入操作的序列,并输出询问操作的答案。

 

 

序列长度最大为操作次数T,每次“添加"操作即改值(需要记一下当前的位置),线段树维护区间最大值

#include <iostream>
#include <algorithm>
using namespace std ;
 const int N=2e5+2;
 #define int long long
#define k1 k<<1
#define k2 k<<1|1
int mod;
 
 int mx[N*4],n,a[N];
 
 int q_max(int k,int l,int r,int x,int y){
     int t=0;
     if(x<=l&&y>=r) return mx[k];
     
     int md=(l+r)/2; 
     if(x<=md) t=max(t,q_max(k1,l,md,x,y)); 
     if(y>md) t=max(t,q_max(k2,md+1,r,x,y)); 
     return t;
 }
 void add(int k,int l,int r,int pos,int v){
     if(l==r&&l==pos){
         mx[k]=v; return;
     }
     int md=(l+r)/2;
     if(pos<=md) add(k1,l,md,pos,v);
    if(pos>md) add(k2,md+1,r,pos,v);
    
     mx[k]=max(mx[k1],mx[k2]);
 }
 void solve(){
     int i,x,T,cnt=0;
     char c;
     scanf("%lld%lld",&T,&mod);
     int last=0;
     
     for(i=1;i<=T;i++){
          scanf(" %c %lld",&c,&x);
          if(c=='Q'){
              printf("%lld\n",last=q_max(1,1,T,cnt-x+1,cnt));
          }
        else{
            cnt++; add(1,1,T,cnt,(x+last)%mod);
        }
     }
 }
 signed main(){ 
   solve();
 }

 



 

posted on 2022-10-27 18:52  towboat  阅读(29)  评论(0)    收藏  举报