#include #include using namespace std; using namespace atcoder; #define rep(i, n) for (int i = 0; i < (int)(n); i++) typedef long long ll; // 円環上の半開区間 [L, R) の和を取得する関数 template ll query_range(T& seg, ll L, ll R, ll m) { if (L >= R) return 0; ll len = R - L; if (len >= m) return seg.prod(0, m); L = (L % m + m) % m; if (L + len <= m) { return seg.prod(L, L + len); } else { return seg.prod(L, m) + seg.prod(0, L + len - m); } } void solve() { int n, q; if (!(cin >> n >> q)) return; int m = 2 * n; // 円環サイズ 2N のセグメント木(初期位置管理用) segtree seg(m); // 問題文は 1-indexed 時刻 (t = 1, 2, ..., q) for (int t = 1; t <= q; ++t) { char type; ll y, z; cin >> type >> y >> z; if (type == 'R') { // 時刻 t で円環座標 y ll pos = (y - t) % m; if (pos < 0) pos += m; seg.set(pos, seg.get(pos) + z); } else if (type == 'L') { // 時刻 t で円環座標 2N - 1 - y ll ring_pos = 2 * n - 1 - y; ll pos = (ring_pos - t) % m; if (pos < 0) pos += m; seg.set(pos, seg.get(pos) + z); } else { // C y z: 区間 [y, z) ll ans = 0; // 1. 右向きの魚: 円環座標 [y, z) ans += query_range(seg, y - t, z - t, m); // 2. 左向きの魚: 円環座標 [2N - z, 2N - y) ans += query_range(seg, 2 * n - z - t, 2 * n - y - t, m); cout << ans << "\n"; } } } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); solve(); return 0; }