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++代码)浏览:779 |
矩阵乘方 (C语言代码)浏览:1022 |
字符串输入输出函数 (C语言代码)浏览:2480 |
2^k进制数 (C语言描述,蓝桥杯)浏览:1420 |
模拟计算器 (C语言代码)浏览:2297 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:480 |
WU-玉龙学长买雪糕 (C++代码)浏览:1106 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:480 |
Manchester- A+B for Input-Output Practice (IV)浏览:1167 |
字符逆序 (C语言代码)浏览:867 |