20pts求条,只对了#9#10
查看原帖
20pts求条,只对了#9#10
812227
Sunrise_beforeglow楼主2025/1/6 09:13
#include <bits/stdc++.h>
using namespace std;
int n,q,a[100005],ans[100005],k;
pair<int,int>last[100005];
char ch[100005];
int l,r,cnt[200005],sum=0,len,c;
unordered_map<int,int>mp;
int ct=0;
struct node
{
    int l,r,t,k,id;
};
vector<node>x;
bool cmp(node a,node b)
{
    if(a.l/len!=b.l/len)return a.l/len>b.l/len;
    else if(a.r/len!=b.r/len)return a.r/len>b.r/len;
    return a.t>b.t;
}
void add(int x)
{
    cnt[a[x]]++;
}
void del(int x)
{
    cnt[a[x]]--;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(!mp.count(a[i]))mp[a[i]]=++ct;
        a[i]=mp[a[i]];
    }
    len=pow(n,0.666);
    for(int i=1;i<=q;i++)
    {
        cin>>ch[i];
        if(ch[i]=='Q')
        {
            node u;
            cin>>u.l>>u.r>>u.k;
            if(!mp.count(u.k))mp[u.k]=++ct;
            u.k=mp[u.k];
            u.t=c;
            u.id=i;
            x.push_back(u);
        }
        else
        {
            c++;
            cin>>last[c].first>>last[c].second;
        }
    }
    sort(x.begin(),x.end(),cmp);
    int l=1,r=0,t=0;
    for(int i=0;i<x.size();i++)
    {
        int p=x[i].id;
        while(x[i].l<l)add(l-1),l--;
        while(x[i].l>l)del(l),l++;
        while(x[i].r>r)add(r+1),r++;
        while(x[i].r<r)del(r),r--;
        while(x[i].t>t)
        {
            t++;
            if(l<=last[t].first&&last[t].first<=r)
            {
                del(last[t].first);
                swap(a[last[t].first],last[t].second);
                add(last[t].first);
            }
            else swap(a[last[t].first],last[t].second);
        }
        while(x[i].t<t)
        {
            if(l<=last[t].first&&last[t].first<=r)
            {
                del(last[t].first);
                swap(a[last[t].first],last[t].second);
                add(last[t].first);
            }
            else swap(a[last[t].first],last[t].second);
            t--;
        }
        ans[p]=cnt[x[i].k];
    }
    for(int i=1;i<=q;i++)if(ch[i]=='Q')cout<<ans[i]<<endl;
    return 0;
}
2025/1/6 09:13
加载中...