题目链接:http://codeforces.com/contest/940/problem/F
带修改莫队板题
代码:
#include<bits/stdc++.h>
using namespace std;
namespace MO
{
const int MAXN=200005;
const int MAXM=100005;
const int BLK=2200;
struct Q
{
int l,r,t,id;
Q(int _l=0,int _r=0,int _t=0,int _id=0):l(_l),r(_r),t(_t),id(_id){}
}Query[MAXM];
struct E
{
int x,u,v;
E(int _x=0,int _u=0,int _v=0):x(_x),u(_u),v(_v){}
}Modify[MAXM];
int a[MAXN],ct[MAXN],occ[MAXN],be[MAXN];
int n,m,q,e;
int ans[MAXM];
int cnt[MAXN];
bool operator < (Q x,Q y)
{
return be[x.l]<be[y.l]||
be[x.l]==be[y.l]&&
((be[x.r]<be[y.r])||
be[x.r]==be[y.r]&&x.t<y.t);
}
void add(int x)
{
occ[cnt[a[x]]]--;
cnt[a[x]]++;
occ[cnt[a[x]]]++;
}
void erase(int x)
{
occ[cnt[a[x]]]--;
cnt[a[x]]--;
occ[cnt[a[x]]]++;
}
void change(int x,int l,int r,bool tp)
{
int y=Modify[x].x;
if(l<=y&&y<=r)
erase(y);
a[y]=tp?Modify[x].v:Modify[x].u;
if(l<=y&&y<=r)
add(y);
}
int ASK()
{
for(int ret=1;;ret++)
{
if(!occ[ret])
return ret;
}
}
void solve()
{
int lcur=1,rcur=0,mcur=0;
for(int i=1;i<=q;i++)
{
while(lcur<Query[i].l) erase(lcur++);
while(Query[i].l<lcur) add(--lcur);
while(Query[i].r<rcur) erase(rcur--);
while(rcur<Query[i].r) add(++rcur);
while(mcur<Query[i].t) change(++mcur,lcur,rcur,1);
while(Query[i].t<mcur) change(mcur--,lcur,rcur,0);
ans[Query[i].id]=ASK();
}
}
}
using namespace MO;
map<int,int> HASH;
int tot=0;
int getid(int x)
{
if(HASH.find(x)==HASH.end())
HASH[x]=++tot;
return HASH[x];
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ct[i]=a[i]=getid(a[i]);be[i]=(i-1)/BLK;
}
for(int i=1;i<=m;i++)
{
int op;
scanf("%d",&op);
if(op==1)
{
int L,R;
scanf("%d%d",&L,&R);
Query[++q]=Q(L,R,e,q);
}
else
{
int p,x;
scanf("%d%d",&p,&x);
x=getid(x);
Modify[++e]=E(p,ct[p],x);ct[p]=x;
}
}
sort(Query+1,Query+1+q);
solve();
for(int i=1;i<=q;i++)
{
printf("%d\n",ans[i]);
}
return 0;
}