acwing1275. 最大数(线段树维护区间最大值)

题意

在这里插入图片描述

代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

#define ls (k << 1)
#define rs (k << 1 | 1)
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
int n, m, p;
struct Tree
{
    
    
    int l, r, mx;
} tr[N * 4];

void push_up(int k)
{
    
    
    tr[k].mx = max(tr[ls].mx, tr[rs].mx);
}
void build(int k, int l, int r)
{
    
    
    tr[k] = {
    
     l, r };
    if (l == r)
    {
    
    
        return;
    }
    /* cout << k << " " << l << " " << r << endl; */

    int md = (l + r) >> 1;
    build(ls, l, md);
    build(rs, md + 1, r);
}

int query(int k, int l, int r)
{
    
    
    if (tr[k].l > r || tr[k].r < l) return -inf;
    if (tr[k].l >= l && tr[k].r <= r) return tr[k].mx;
    return max(query(ls, l, r), query(rs, l, r));
}

void update(int k, int l, int r, int x)
{
    
    
    if (tr[k].l > r || tr[k].r < l) return;
    if (tr[k].l == tr[k].r)
    {
    
    
        tr[k].mx = x;
        return;
    }
    /* cout << k << " " << l << " " << r << endl; */
    update(ls, l, r, x);
    update(rs, l, r, x);
    push_up(k);
}


int main()
{
    
    
    scanf("%d %d", &m, &p);
    char op[2]; int x;
    build(1, 1, m);
    int last = 0;
    for (int i = 1; i <= m; i ++) {
    
    
        scanf("%s %d", op, &x);
        if (op[0] == 'A')
        {
    
    
            ++ n;
            update(1, n, n, (1LL * x + last) % p);
        }
        else
        {
    
    
            printf("%d\n", last = query(1, n - x + 1, n));
        }
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34261446/article/details/121138750