40分求条
查看原帖
40分求条
1423724
dyxcj楼主2025/7/30 19:59
#include <bits/stdc++.h>
using namespace std;
const int N=10000005;
long long n,m,a[N],B,qm,um,b[N],nl=1,nr,now,js[N];
long long sum;
struct wasd{
    int l,r,sum,i;
    long long n;
}d[N];
struct node{
    int v,lv,w;
}op[N];
bool cmp(wasd x,wasd y){
    if(x.l/B!=y.l/B)return x.l<y.l;
    if(x.r/B!=y.r/B)return x.r<y.r;
    return x.sum<y.sum;
}
bool cmp1(wasd x,wasd y){
    return x.i<y.i;
}
void add(int u){
	if(!js[a[u]])sum++;
	js[a[u]]++;
}
void del(int u){
	js[a[u]]--;
	if(!js[a[u]])sum--;
}
void back(int x,int l,int r){
	int p=op[x].w;
    if(l<=p&&p<=r){
        del(x);
        a[p]=op[x].v;
        add(x);
    }else{
        a[p]=op[x].v;
    }
}
void past(int x,int l,int r){
    int p=op[x].w;
    if(l<=p&&p<=r){
        del(x);
        a[p]=op[x].lv;
        add(x);
    }else{
        a[p]=op[x].lv;
    }
}
long long Modui(int u,int l,int r){
    while(nl>l)add(--nl);
    while(nl<l)del(nl++);
    while(nr>r)del(nr--);
    while(nr<r)add(++nr);
    while(now<d[u].sum)back(++now,l,r);
    while(now>d[u].sum)past(now--,l,r);
    return sum;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];
    B=pow(n,0.666);
    for(int i=1,l,r,p,c;i<=m;i++){
        char w;
        cin>>w;
        if(w=='Q'){
            cin>>l>>r;
            d[++qm].l=l,d[qm].r=r,d[qm].sum=um,d[qm].i=qm;
        }else{
            cin>>p>>c;
            op[++um].w=p,op[um].v=c,op[um].lv=b[p],b[p]=c;
        }
    }
    sort(d+1,d+1+qm,cmp);
    for(int i=1;i<=qm;i++)d[i].n=Modui(i,d[i].l,d[i].r);
    sort(d+1,d+1+qm,cmp1);
    for(int i=1;i<=qm;i++)cout<<d[i].n<<"\n";
    return 0;
}
2025/7/30 19:59
加载中...