1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| _#include <bits/stdc++.h>
#define ed '\n' #define fi first #define se second #define fore(i, l, r) for(int i = (int)(l); i <=(int)r; i++) #define out(x, k) cout << fixed << setprecision(k) << x << ed
using namespace std;
typedef pair<int, int> PII; typedef long long LL; typedef double db;
const int INF = 1e9; const int N = 2e5 + 10;
int m, p; struct Node{ int l, r; int v; }tr[4 * N];
void pushup(int u) { tr[u].v = max(tr[u << 1].v, tr[u << 1 | 1].v); }
void build(int u, int l, int r) { tr[u] = {l, r}; if (l == r) return; int mid = l + r >> 1; build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r); }
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 = max(v, query(u << 1 | 1, l, r)); return v; }
void modify(int u, int x, int v) { if (tr[u].l == x && tr[u].r == x) tr[u].v = v; else { int mid = tr[u].l + tr[u].r >> 1; if (x <= mid) modify(u << 1, x, v); else modify(u << 1 | 1, x, v); pushup(u); } } void solve() { int n = 0, last = 0; cin >> m >> p; build(1, 1, m); int x; char op[2]; while (m--) { cin >> op >> x; if (*op == 'Q') { last = query(1, n - x + 1, n); cout << last << '\n'; } else { modify(1, n + 1, ((LL)last + x) % p); ++n; } } } int main() { ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int _ = 1; while(_--) { solve(); } return 0;
|