可持久化线段树20pts求调
查看原帖
可持久化线段树20pts求调
674147
vanueber楼主2024/12/28 20:26
#include <bits/stdc++.h>
#define ls tr[p].l
#define rs tr[p].r
using namespace std;
const int INF=0x3f3f3f3f;
inline int read()
{
    int w=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        w=(w<<1)+(w<<3)+(ch^48);
        ch=getchar();
    }
    return w*f;
}
inline void write(int x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

const int maxn=1e5+10,maxv=maxn<<1;
int n,m,a[maxn],tmp[maxv];
int cnt;
int rt[maxv],tot;
struct q
{
    string opt;
    int a,p,b,k;
}qs[maxn];
struct node
{
    int l,r,sum;
}tr[maxn<<5];
void pushup(int p)
{
    tr[p].sum=tr[ls].sum+tr[rs].sum;
}
void build(int &p,int l,int r)
{
    p=++tot;
    if(l==r) return;
    int mid=(l+r)>>1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(p);
}
void update(int pre,int &p,int l,int r,int pos,int k)
{
    p=++tot,tr[p]=tr[pre];
    if(l==r)
    {
        tr[p].sum+=k;
        return;
    }
    int mid=(l+r)>>1;
    if(mid>=pos) update(tr[pre].l,ls,l,mid,pos,k);
    else update(tr[pre].r,rs,mid+1,r,pos,k);
    pushup(p);
}
int query(int pre,int p,int l,int r,int k)
{
    if(l==r) return tr[p].sum-tr[pre].sum;
    int mid=(l+r)>>1;
    if(mid>=k) return query(tr[pre].l,ls,l,mid,k);
    else return query(tr[pre].r,rs,mid+1,r,k);
}
int main()
{
    #ifndef ONLINE_JUDGE
    //freopen("in.txt","r",stdin);
    #endif
    n=read(),m=read();
    for(int i=1;i<=n;++i)
    {
        tmp[++cnt]=a[i]=read();
    }
    for(int i=1;i<=m;++i)
    {
        cin>>qs[i].opt;
        if(qs[i].opt=="C")
        {
            qs[i].a=read(),qs[i].p=read();
            tmp[++cnt]=qs[i].p;
        }
        else
        {
            qs[i].a=read(),qs[i].b=read(),qs[i].k=read();
        }
    }
    sort(tmp+1,tmp+cnt+1);
    cnt=unique(tmp+1,tmp+cnt+1)-tmp-1;
    for(int i=1;i<=n;++i)
    {
        a[i]=lower_bound(tmp+1,tmp+cnt+1,a[i])-tmp;
    }
    for(int i=1;i<=m;++i)
    {
        if(qs[i].opt=="C")
        {
            qs[i].p=lower_bound(tmp+1,tmp+cnt+1,qs[i].p)-tmp;
        }
    }
    build(rt[0],1,cnt);
    for(int i=1;i<=n;++i)
    {
        update(rt[i-1],rt[i],1,cnt,a[i],1);
    }
    
    for(int i=1;i<=m;++i)
    {
        if(qs[i].opt=="C")
        {
            update(rt[qs[i].a],rt[qs[i].a],1,cnt,a[qs[i].a],-1);
            update(rt[qs[i].a],rt[qs[i].a],1,cnt,qs[i].p,1);
            a[qs[i].a]=qs[i].p;
        }
        else
        {
            printf("%d\n",query(rt[qs[i].a-1],rt[qs[i].b],1,cnt,qs[i].k));
        }
    }
    return 0;
}
2024/12/28 20:26
加载中...