随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

给定一个正整数数列 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   towboat  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示