给定一个正整数数列 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(); }
标签:md,int,pos,一本,1549,序列,操作,mx From: https://www.cnblogs.com/towboa/p/16833338.html