10分求助
  • 板块P4879 ycz的妹子
  • 楼主ljh6jz
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/11/10 15:56
  • 上次更新2023/11/4 00:58:14
查看原帖
10分求助
157147
ljh6jz楼主2021/11/10 15:56
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ls p << 1
#define rs p << 1 | 1
const int N = (int)5e5 + 5, M = (int)5e5;
int n, q, f[N];
ll a[N << 2], lazy[N << 2], tag[N << 2];

inline int read()
{
    int s = 0, f = 0;
    char ch = getchar();
    while (ch < 48 || ch > 57)
    {
        if (ch == '-')
            f = 1;
        ch = getchar();
    }
    while (ch >= 48 && ch <= 57)
    {
        s = (s << 3) + (s << 1) + (ch ^ 48);
        ch = getchar();
    }
    return f ? -s : s;
}

void pushup(int p)
{
    a[p] = a[ls] + a[rs];
}

void pushdown(int p, int l, int r)
{
    int mid = (l + r) >> 1;
    if (tag[p] != 0)
    {
        tag[ls] = tag[rs] = tag[p];
        a[ls] = tag[p] * (ll)(mid - l + 1);
        a[rs] = tag[p] * (ll)(r - mid);
        lazy[p] = tag[p] = 0;
    }
    if (lazy[p] != 0)
    {
        lazy[ls] += lazy[p];
        lazy[rs] += lazy[p];
        a[ls] += (ll)(mid - l + 1) * lazy[p];
        a[rs] += (ll)(r - mid) * lazy[p];
        lazy[p] = 0;
    }
}

void build(int p, int l, int r)
{
    if (l == r)
    {
        a[p] = f[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(ls, l, mid);
    build(rs, mid + 1, r);
    pushup(p);
}

ll query(int p, int l, int r, int x, int y)
{
    if (x <= l && r <= y)
    {
        return a[p];
    }
    pushdown(p, l, r);
    int mid = (l + r) >> 1;
    ll ans = 0;
    if (x <= mid)
    {
        ans += query(ls, l, mid, x, y);
    }
    if (y > mid)
    {
        ans += query(rs, mid + 1, r, x, y);
    }
    return ans;
}

void update(int p, int l, int r, int x, int y, int k, int type)
{
    if (x <= l && r <= y)
    {
        if (type)
        {
            tag[p] = k;
            a[p] = (r - l + 1) * k;
            lazy[p] = 0;
        }
        else
        {
            lazy[p] += k;
            a[p] += (r - l + 1) * k;
        }
        return;
    }
    pushdown(p, l, r);
    int mid = (l + r) >> 1;
    if (x <= mid)
    {
        update(ls, l, mid, x, y, k, type);
    }
    if (y > mid)
    {
        update(rs, mid + 1, r, x, y, k, type);
    }
    pushup(p);
}

signed main()
{
    // freopen("P4879.in", "r", stdin);
    n = read(), q = read();
    for (int i = 1; i <= n; ++i)
    {
        f[i] = read();
    }
    build(1, 1, M);
    while (q--)
    {
        char ch;
        cin >> ch;
        int x, y;
        if (ch == 'Q')
        {
            printf("%lld\n", query(1, 1, M, 1, M));
        }
        else if (ch == 'C')
        {
            x = read(), y = read();
            update(1, 1, M, x, x, -y, 0);
        }
        else if (ch == 'I')
        {
            x = read(), y = read();
            update(1, 1, M, x, x, y, 1);
        }
        else
        {
            x = read();
            update(1, 1, M, x, x, 0, 1);
        }
    }
    return 0;
}

2021/11/10 15:56
加载中...