萌新求助,P3939 主席树95pts!
  • 板块题目总版
  • 楼主Eric_jx
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/7/6 10:22
  • 上次更新2023/11/3 11:23:15
查看原帖
萌新求助,P3939 主席树95pts!
678191
Eric_jx楼主2023/7/6 10:22
#include<bits/stdc++.h>
using namespace std;
#define lc(x) t[x].l
#define rc(x) t[x].r
struct stu{
    int l,r,s;
}t[18000005];
int a[300005],root[300005],n,m,in;
void build(int &x,int l,int r){
    x=++in;
    if(l==r){
        return;
    }
    int mid=(l+r)>>1;
    build(lc(x),l,mid);
    build(rc(x),mid+1,r);
}
void insert(int x,int &y,int l,int r,int k,int add){
    y=++in;
    t[y]=t[x];
    t[y].s+=add;
    if(l==r){
        return;
    }
    int mid=(l+r)>>1;
    if(k<=mid){
        insert(lc(x),lc(y),l,mid,k,add);
    }
    else{
        insert(rc(x),rc(y),mid+1,r,k,add);
    }
}
int query(int x,int y,int l,int r,int k){
    if(l==r){
        return t[y].s-t[x].s;
    }
    int mid=(l+r)>>1;
    if(k<=mid){
        return query(lc(x),lc(y),l,mid,k);
    }
    else{
        return query(rc(x),rc(y),mid+1,r,k);
    }
} 
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    build(root[0],1,n);
    for(int i=1;i<=n;i++){
        insert(root[i-1],root[i],1,n,a[i],1);
    }
    while(m--){
        int op;
        scanf("%d",&op);
        if(op==1){
            int l,r,c;
            scanf("%d%d%d",&l,&r,&c);
            cout<<query(root[l-1],root[r],1,n,c)<<"\n";
        }
        else{
            int x;
            scanf("%d",&x);
            insert(root[x-1],root[x],1,n,a[x+1],1);
            swap(a[x],a[x+1]);
        }
    }
    return 0;
}
2023/7/6 10:22
加载中...