#include <cstdio>
#include <cctype>
const int SIZ = 1 << 20;
char buf[SIZ], *p1, *p2;
char gc() {
if (p1 == p2) p1 = buf, p2 = buf + fread(buf, 1, SIZ, stdin);
return p1 == p2 ? EOF : *p1++;
}
inline int read() {
int f = 0, flag = 1;
char c = gc();
while (!isdigit(c)) {
if (c == '-') flag = -1;
c = gc();
}
while (isdigit(c)) f = f * 10 + c - 48, c = gc();
return f * flag;
}
const int N = 5000010;
int mod;
int max(const int &a, const int &b) {
return a > b ? a : b;
}
struct SegmentTree
{
int mx[N * 4];
void pushup(int u) {
mx[u] = max(mx[u << 1], mx[u << 1 | 1]);
}
void modify(int u, int l, int r, int x, int v) {
if (l == r) mx[u] = (1LL * mx[u] + v) % mod;
else {
int mid = l + r >> 1;
if (x <= mid) modify(u << 1, l, mid, x, v);
else modify(u << 1 | 1, mid + 1, r, x, v);
pushup(u);
}
}
int query(int u, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return mx[u];
else {
int mid = l + r >> 1;
int res = 0;
if (ql <= mid) res = query(u << 1, l, mid, ql, qr);
if (qr > mid) res = max(res, query(u << 1 | 1, mid + 1, r, ql, qr));
return res;
}
}
} smt;
int main() {
int n = read();
mod = read();
int t = 0;
int len = 0;
while (n--) {
char op = gc();
while (op != 'A' && op != 'Q') op = gc();
int x = read();
if (op == 'A') {
smt.modify(1, 1, 5000000, ++len, (1LL * x + t) % mod);
}
else {
t = smt.query(1, 1, 5000000, len - x + 1, len);
printf("%d\n", t);
}
}
return 0;
}
共 2 条回复
就差亿点然而被卡空间