P4879 ycz的妹子

思路

让你干啥你就干啥呗
查询第x个妹子就get一下再修改
这里稳一点就维护了三个东西,也许两个也可以

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#define ls rt<<1
#define rs rt<<1|1
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn = 5e5 + 7;
int read() {
    int x = 0, f = 1; char s = getchar();
    for (; s < '0' || s > '9'; s = getchar()) if (s == '-') f = -1;
    for (; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
    return x * f;
}
int n,m;
int a[maxn];
struct node {
    int l,r,size,gs;
    ll sum,ans;
}e[maxn<<2];
void pushup(int rt) {
    e[rt].gs=e[ls].gs+e[rs].gs;
    e[rt].ans=e[ls].ans+e[rs].ans;
    e[rt].sum=e[ls].sum+e[rs].sum;
}
void build(int l,int r,int rt) {
    e[rt].l=l,e[rt].r=r,e[rt].size=r-l+1;
    if(l==r) {
        if(l<=n) {
            e[rt].gs=1;
            e[rt].ans=e[rt].sum=a[l];
        }
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,ls);
    build(mid+1,r,rs);
    pushup(rt);
}
void modify_1(int L,int k,int rt) { // The Lth city plus k .
    if(e[rt].l==e[rt].r) {
        e[rt].sum+=k;
        if(e[rt].gs) e[rt].ans+=k;
        return;
    }
    int mid=(e[rt].l+e[rt].r)>>1;
    if(L<=mid) modify_1(L,k,ls);
    else modify_1(L,k,rs);
    pushup(rt);
}
void modify_2(int L,int k,int rt) { // The Lth sister fell in love with him.
    if(e[rt].l==e[rt].r) {
        e[rt].gs=k;
        e[rt].ans=e[rt].sum=0;
        return;
    }
    int mid=(e[rt].l+e[rt].r)>>1;
    if(L<=mid) modify_2(L,k,ls);
    else modify_2(L,k,rs);
    pushup(rt); 
}
int get(int k,int rt) {
    if(e[rt].l==e[rt].r)
        return e[rt].l;
    if(k <= e[ls].gs) return get(k,ls);
    else return get(k-e[ls].gs,rs);
}
int main() {
    n=read(),m=read();
    FOR(i,1,n) a[i]=read();
    build(1,5e5,1);
    FOR(i,1,m) {
        char s;
        scanf("%s",&s);
        if(s=='Q') {
            printf("%lld\n",e[1].ans);
        } else if(s=='C') {
            int x=read(),y=read();
            modify_1(x,-y,1);
        } else if(s=='D') {
            int x=read();
            modify_2(get(x,1),0,1);
        } else if(s=='I') {
            int x=read(),y=read();
            modify_2(x,1,1);
            modify_1(x,y,1);
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/dsrdsr/p/9878124.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值