0
点赞
收藏
分享

微信扫一扫

最大数(线段树)

宁静的猫 2022-02-02 阅读 45

link

#include <bits/stdc++.h>
#define go continue
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fory(i,a,b) for(int i = a; i <= b; ++i)
//-----
#define int long long
//-----
using namespace std;

template <typename T> inline void read(T& t)
{
    int f = 0, c = getchar();
    t = 0;
    while (!isdigit(c)) f |= c == '-', c = getchar();
    while (isdigit(c)) t = t * 10 + c - 48, c = getchar();
    if (f) t = -t;
}

template <typename T> void print(T x)
{
    if (x < 0) x = -x, putchar('-');
    if (x > 9) print(x / 10);
    putchar(x % 10 + 48);
}

inline void _sort(int* a, int l, int id)
{
    id == 1 ? sort(a + 1, a + 1 + l, less<int>()) : sort(a + 1, a + 1 + l, greater<int>());
}
//--------------------------------------------
const int N = 200010;

struct node
{
    int l, r, num;
};

int m, p;

struct _segment_tree
{
    node t[N << 2];
    int mp[N];

    void push_up(int root)
    {
        int h = root << 1;
        t[root].num = max(t[h].num, t[h + 1].num);
    }

    void build(int root, int l, int r)
    {
        t[root].l = l;
        t[root].r = r;
        if(l != r)
        {
            int mid = (l + r) >> 1;
            int h = root << 1;
            build(h, l, mid);
            build(h + 1, mid + 1, r);
            //push_up(root);
        }
        else
        {
            mp[l] = root;
        }
    }

    void change(int x, int y)
    {
        x = mp[x];
        t[x].num = y;
        while(x >>= 1) push_up(x);
    }

    int query(int root, int l, int r)
    {
        if(t[root].l == l && t[root].r == r)
        {
            return t[root].num;
        }
        int mid = (t[root].l + t[root].r) >> 1;
        int h = root << 1;

        if(r <= mid) return query(h, l, r);
        else if(l > mid) return query(h + 1, l, r);
        else return max(query(h, l, mid), query(h + 1, mid + 1, r));
    }

};
_segment_tree st;


signed main()
{

    IOS;

    int n = 0, last = 0;
    cin >> m >> p;

    st.build(1, 1, m);

    int x;
    string op;

    while(m--)
    {
        cin >> op >> x;
        if(op == "Q")
        {
            last = st.query(1, n - x + 1, n);
            cout << last << "\n";
        }
        else
        {
            st.change(n + 1, (last + x) % p);
            n++;
        }
    }

    return 0;
}
举报

相关推荐

0 条评论