求调,Subtask #0 11 Wa,玄一关
查看原帖
求调,Subtask #0 11 Wa,玄一关
661638
lkjzyd20楼主2024/10/7 16:14
// liukejie
// 2024-10-07 14:44:51
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define rep(i, l, r) for(int i = l; i <= r; ++ i)
#define per(i, r, l) for(int i = r; i >= l; -- i)

#define ls rt + rt
#define rs rt + rt + 1
const int N = 5e5 + 10;
int p, n, Q;
struct Segment_Tree
{
    int sum[N << 2], tag[N << 2];
    void update(int rt) { sum[rt] = max(sum[ls], sum[rs]); }
    void push_up(int rt, int l, int r, int val)
    {
        tag[rt] += val;
        sum[rt] += val * (r - l + 1);
    }
    void push_down(int rt, int l, int r)
    {
        int mid = (l + r) >> 1;
        push_up(ls, l, mid, tag[rt]);
        push_up(rs, mid + 1, r, tag[rt]);
        tag[rt] = 0;
    }
    void change(int rt, int l, int r, int x, int y, int val)
    {
        if (l >= x && r <= y) {push_up(rt, l, r, val); return;}
        push_down(rt, l, r);
        int mid = (l + r) >> 1;
        if (x <= mid) change(ls, l, mid, x, y, val);
        if (y > mid) change(rs, mid + 1, r, x, y, val);
        update(rt);
    }
    int ask(int rt, int l, int r, int x, int y)
    {
        int ans = -1e18;
        if (l >= x && r <= y) return sum[rt];
        int mid = (l + r) >> 1;
        push_down(rt, l, r);
        if (x <= mid) ans = max(ans, ask(ls, l, mid, x, y));
        if (y > mid) ans = max(ans, ask(rs, mid + 1, r, x, y));
        return ans;
    }
}t;
main()
{
    scanf("%lld%lld", &Q, &p);
    n = 1;
    int o = 0;
    rep(i, 1, Q)
    {
        char a; int x;
        cin >> a; scanf("%d", &x);
        if(a == 'Q')
        {
            o = t.ask(1, 1, Q, n - x + 1, n) % p;
            printf("%lld\n", o);
        }
        else 
        {
            ++ n;
            t.change(1, 1, Q, n, n, (x + o) % p);
        }
    }
    
    return 0;
}
2024/10/7 16:14
加载中...