莫队 WAon3 90pts 求助(开O2)
查看原帖
莫队 WAon3 90pts 求助(开O2)
263333
HuAnGwEnJiEx楼主2022/7/20 10:42
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int N=100010;
int n,m,len,cnt[N],w[N],mq,mt,ans[N];
struct Query{
    int id,l,r,t,ask;
}q[N];
struct change{
    int p,v;
}c[N];
vector<int> nums;
int get(int x){return x/len;}
bool cmp(Query& a,Query& b)
{
    int al=get(a.l),bl=get(b.l),ar=get(a.r),br=get(b.r);
    if(al!=bl) return al<bl;
    if(ar!=br) return ar<br;
    return a.t<b.t;
}
void add(int x)
{
    cnt[x]++;
}
void del(int x)
{
    cnt[x]--;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&w[i]),nums.push_back(w[i]);
    sort(nums.begin(),nums.end());
	nums.erase(unique(nums.begin(),nums.end()),nums.end());
	for(int i=1;i<=n;i++)
	{
		w[i]=lower_bound(nums.begin(),nums.end(),w[i])-nums.begin();
	}
    for(int i=0;i<m;i++)
    {
        char op[2];
        int a,b;
        scanf("%s%d%d",op,&a,&b);
        if(*op=='Q'){
            int ask;
            scanf("%d",&ask);
            ask=lower_bound(nums.begin(),nums.end(),ask)-nums.begin();
            q[++mq]={mq,a,b,mt,ask};
        }
        else {b=lower_bound(nums.begin(),nums.end(),b)-nums.begin();c[++mt]={a,b}; }
    }
    len=cbrt((double)n*max(1,mt))+1;
    sort(q+1,q+mq+1,cmp);
    for(int i=0,j=1,res=0,k=1,nt=0;k<=mq;k++)
    {
        int id=q[k].id,l=q[k].l,r=q[k].r,t=q[k].t,ask=q[k].ask;
        while(i<r) add(w[++i]);
        while(i>r) del(w[i--]);
        while(j>l) add(w[--j]);
        while(j<l) del(w[j++]);
        while(nt<t)
        {
            nt++;
            if(l<=c[nt].p&&c[nt].p<=r)
            {
                add(c[nt].v);
                del(w[c[nt].p]);
            }
            swap(c[nt].v,w[c[nt].p]);
        }
        while(nt>t)
        {
            if(l<=c[nt].p&&c[nt].p<=r)
            {
                add(c[nt].v);
                del(w[c[nt].p]);
            }
            swap(c[nt].v,w[c[nt].p]);
            nt--;
        }
        ans[id]=cnt[ask];
    }
    for(int i=1;i<=mq;i++)
    printf("%d\n",ans[i]);
    return 0;
}
2022/7/20 10:42
加载中...