Codeforces Round #466 (Div. 2) F. Machine Learning 莫队+分块 带修莫队的模板题

#include <bits/stdc++.h>
#define N 300005
#define ll long long
using namespace std;
int n,m,tot,opcnt,qcnt,B,now;
int a[N],A[N],output[N],cnt[N],mex[N];
struct query
{
    int l,r,id,t;
    bool operator<(query b) const
    {
        return l/B==b.l/B?(r/B==b.r/B?t<b.t:r<b.r):l<b.l;
    }
} q[N];
struct change
{
    int p,x;
} c[N];
void add(int num)
{
    --mex[cnt[num]];
    ++mex[++cnt[num]];
}
void del(int num)
{
    --mex[cnt[num]];
    ++mex[--cnt[num]];
}
void update(int id,int t)
{
    if(c[t].p>=q[id].l&&c[t].p<=q[id].r)
    {
        del(a[c[t].p]);
        add(c[t].x);
    }
    swap(c[t].x, a[c[t].p]);
}
int getans()
{
    int i;
    for(i=1; mex[i]>0; ++i);
    return i;
}
int main()
{
    int l=2,r=1;
    scanf("%d%d",&n,&m);
    B=pow(n,0.6666);
    for(int i=1; i<=n; ++i)
    {
        scanf("%d",&a[i]);
        A[++tot]=a[i];
    }
    for(int i=1; i<=m; ++i)
    {
        int op,a,b;
        scanf("%d%d%d",&op,&a,&b);
        if(op==1)
        {
            ++qcnt;
            q[qcnt]={a,b};
            q[qcnt].id=qcnt;
            q[qcnt].t=opcnt;
        }
        else
        {
            ++opcnt;
            c[opcnt]={a,b};
            A[++tot]=b;
        }
    }
    sort(A+1,A+1+tot);
    for(int i=1; i<=n; ++i) 
        a[i]=lower_bound(A+1,A+1+tot,a[i])-A;
    for(int i=1; i<=opcnt; ++i) 
        c[i].x=lower_bound(A+1,A+1+tot,c[i].x)-A;
    sort(q+1,q+1+qcnt);
    for(int i=1; i<=qcnt; ++i)
    {
        while(l>q[i].l) add(a[--l]);
        while(r<q[i].r) add(a[++r]);
        while(l<q[i].l) del(a[l++]);
        while(r>q[i].r) del(a[r--]);
        while(now<q[i].t) update(i, ++now);
        while(now>q[i].t) update(i, now--);
        output[q[i].id]=getans();
    }
    for(int i=1; i<=qcnt; ++i) 
        printf("%d\n",output[i]);
    return 0;
}

 

Codeforces Round #466 (Div. 2) F. Machine Learning 莫队+分块 带修莫队的模板题

上一篇:Snagit 2019 for Mac如何合并图像


下一篇:eclipse使用之添加插件