题意:给你n个数,m个询问 询问[L,R]的Mex,与修改一个位置的数。
题解:带修改莫队裸题,需要注意的是莫队l,r移动的时候先考虑范围加,再考虑范围减,不然会RE。
AC代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=(int)(2e5+10);
int N,M,Qnum,Cnum,tot;
int a[MAXN],b[MAXN],c[MAXN],where[MAXN];
struct Query
{
int x,y,time,id;
}Q[MAXN];
struct Change
{
int pos,pre,val;
}C[MAXN];
int num[MAXN],ans[MAXN],len,cntnum[MAXN/2];
int comp(const Query &a,const Query &b)
{
if(where[a.x]!=where[b.x]) return a.x<b.x;
if(where[a.y]!=where[b.y]) return a.y<b.y;
return a.time<b.time;
}
void Add(int val)
{
cntnum[num[val]]--;
num[val]++;
cntnum[num[val]]++;
}
void Delet(int val)
{
cntnum[num[val]]--;
num[val]--;
cntnum[num[val]]++;
}
void mAdd(int now,int i)
{
if(C[now].pos>=Q[i].x&&C[now].pos<=Q[i].y)//注意:只有修改在查询的区间内才会对查询的结果产生影响
{
Delet(C[now].pre);
Add(C[now].val);
}
a