import java.io.*;
public class Main{
static Node tr[];
public static void main(String[]args) throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
String s[]=br.readLine().split(" ");
int m=Integer.parseInt(s[0]),p=Integer.parseInt(s[1]);
tr=new Node[m*4];
int last=0,x=0,n=1;
build_tree(1,1,m);
while(m--!=0){
s=br.readLine().split(" ");
x = Integer.valueOf(s[1]);
if("Q".equals(s[0])){
last = query(1, n - x + 1, n);
bw.write(last + "\n");
}else{
modify(1, n + 1, (last + x) % p); //注意,这里根节点是1, 修改的数是从n + 1开始。
n++;
}
bw.flush();
}
}
static void build_tree(int u,int l,int r){
tr[u]=new Node(l,r);
if(l==r) return;
int mid=l+r>>1;
build_tree(u<<1,l,mid);
build_tree(u<<1|1,mid+1,r);
}
static void modify(int u,int x,int c){
if(tr[u].l==x&&tr[u].r==x){
tr[u].v=c;
}else{
int mid=tr[u].l+tr[u].r>>1;
if(x<=mid) modify(u<<1,x,c);
else modify(u<<1|1,x,c);
pushUp(u);
}
}
static void pushUp(int u){
tr[u].v=Math.max(tr[u<<1].v,tr[u<<1|1].v);
}
static int query(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].v;
int mid=tr[u].l+tr[u].r>>1;
int v=0;
if(l<=mid) v=query(u<<1,l,r);
if(r>mid) v=Math.max(v,query(u<<1|1,l,r));
return v;
}
}
class Node{
int l,r,v;
Node(int l,int r){
this.l=l;
this.r=r;
}
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复