某人学了快读之后卷土重来(bushi

Star 2022-10-20 20:32:31

#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 条回复

Star

就差亿点

Laffey

然而被卡空间