RT,CF940F,求帮忙修一下
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+10;
int l[MAXN],r[MAXN],cnt[MAXN];
int n,m,num,t,a[MAXN],pos[MAXN];
int cnt1 = 0,idx = 0;
int ans[MAXN];
struct inputq{
int le,ri,idx,ans,cht;
}inq[MAXN];
struct inputu{
int p,col;
}inu[MAXN];
bool Cmp(inputq &a,inputq &b)//
{
if(pos[a.le] != pos[b.le])
{
return pos[a.le] < pos[b.le];
}
else//pos[l]->pos[r]->r->cht;
{
if(a.ri != b.ri)
{
return a.ri < b.ri;
}
else
{
return a.cht < b.cht;
}
}
}
bool AnsCmp(inputq &a,inputq &b)
{
return a.idx < b.idx;
}
void L2R_R2L(int i,int j)
{
cnt[a[i]]--;
if(cnt[a[i]] == 0)
inq[j].ans--;
}
void R2R_L2L(int i,int j)
{
cnt[a[i]]++;
if(cnt[a[i]] == 1)
inq[j].ans++;
}
void del(int i,int j)
{
cnt[i]--;
if(cnt[i] == 0)
inq[j].ans--;
}
void add(int i,int j)
{
cnt[i]++;
if(cnt[i] == 1)
inq[j].ans++;
}
void upd(int cht,int L,int R,int j)
{
if(L <= inu[cht].p && inu[cht].p <= R)
{
del(a[inu[cht].p],j);
add(inu[cht].col,j);
}
swap(a[inu[cht].p],inu[cht].col);
}
void Query()
{
int L = 1,R = 0,cht = 0;
for(int i = 1;i <= idx;i++)
{
while(L < inq[i].le)
{
L2R_R2L(L,i);
L++;
}
while(R < inq[i].ri)
{
R++;
R2R_L2L(R,i);
}
while(L > inq[i].le)
{
L--;
R2R_L2L(L,i);
}
while(R > inq[i].ri)
{
L2R_R2L(R,i);
R--;
}
while(cht < inq[i].cht)
{
cht++;
upd(cht,L,R,i);
}
while(cht > inq[i].cht)
{
upd(cht,L,R,i);
cht--;
}
vector<int> b;
// cout << "{";
int i1;
for(i1 = L;i1 <= R;i1++)
{
b.push_back(cnt[a[i1]]);
// cout << a[i1] << " ";
}
// cout << endl;
// cout << "}";
// for(i1 = L;i1 <= R;i1++)
// {
// cout << cnt[a[i1]] << " ";
// }
// cout << endl;
sort(b.begin(),b.end());
vector<int>::iterator pos = unique(b.begin(),b.end());
b.erase(pos,b.end());
// cout << "{";
// for(i1 = 0;i1 < b.size();i1++)
// cout << b[i1] << " ";
// cout << endl;
for(i1 = 1;b[i1-1] == b[i1] - 1;i1++);
printf("%d\n",i1+1);
inq[i + 1].ans = inq[i].ans;
}
sort(inq+1,inq+idx+1,AnsCmp);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
}
t = pow(n,2.0/3);
num = n / t;
if(n % t)
num++;
for(int i = 1;i <= num;i++)
{
l[i] = (i - 1) * t + 1;
r[i] = i * t;
}
r[num] = n;
for(int i = 1;i <= num;i++)
{
for(int j = l[i];j <= r[i];j++)
{
pos[j] = i;
}
}
int x,y;
for(int i = 1;i <= m;i++)
{
int opt;
cin >> opt;
scanf("%d%d",&x,&y);
if(opt == 1)
{
idx++;
inq[idx].le = x;
inq[idx].ri = y;
inq[idx].idx = idx;
inq[idx].cht = cnt1;
inq[idx].ans = 0;
}
else if(opt == 2)
{
cnt1++;
inu[cnt1].p = x;
inu[cnt1].col = y;
}
}
sort(inq+1,inq+idx,Cmp);
Query();
return 0;
}