莫队算法

namespace mo
{
    int n,q,blo;
    ll a[__],ans[__],res;
    struct query{int l,r,id;}qj[__];

    void sfd(){fup(i,1,n)scanf("%lld",a+i);}
    void sfq(){fup(i,1,q)scanf("%d%d",&qj[i].l,&qj[i].r),qj[i].id=i;}
    void pf(){fup(i,1,q)printf("%lld\n",ans[i]);}
    void add(int x)
    {
    }
    void cut(int x)
    {
    }
    bool cmp(const query& x,const query& y)
    {
        if(x.l/blo==y.l/blo)return x.rqj[i].l)--l,add(l);
            while(r>qj[i].r)cut(r),--r;
            while(l

带修改莫队

const int __=10005;
int a[__],b[__],n,qdx=0,mdx=0,bsz;
int ans[__],times[1000005];

struct query
{
    int l,r,md,id;
    void set(int _l,int _r,int _md,int _id)
    {
        l=_l,r=_r,md=_md,id=_id;
    }
    bool operator<(const query &b)const
    {
        if(l/bsz!=b.l/bsz)return lque[i].md)del(l,r,t),--t;
        while(lque[i].l)--l,add(a[l]);
        while(rque[i].r)cut(a[r]),--r;
        ans[que[i].id]=res;
    }
}

int main()
{
    int q;sf("%d%d",&n,&q);
    fup(i,1,n)sf("%d",&a[i]),b[i]=a[i];
    fup(i,1,q)
    {
        char op[2];int l,r;
        sf("%s%d%d",op,&l,&r);
        if(op[0]=='Q')
            ++qdx,que[qdx].set(l,r,mdx,qdx);
        if(op[0]=='R')
            mod[++mdx].set(l,0,r);
    }
    fup(i,1,mdx)
    {
        mod[i].x=b[mod[i].wz];
        b[mod[i].wz]=mod[i].y;
    }
    work();
    fup(i,1,qdx)
        pf("%d\n",ans[i]);
    return 0;
}

你可能感兴趣的:(莫队算法)