#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,k=1;
char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*k;
}
const int MAXN=1e5+20;
struct node
{
int l,r,val,index,p,ti;
}e[MAXN],e1[MAXN];
int cnt,cnt1,cnt2,tt,buck[MAXN<<1],disperse[MAXN<<1],cntt[MAXN<<1],a[MAXN],ans[MAXN];
inline bool cmp(node s,node s1)
{
if(s.l/tt==s1.l/tt)
{
if(s.r/tt==s1.r/tt) return s.ti<s1.ti;
else return s.r<s1.r;
}
else return s.l<s1.l;
}
inline void del(int x)
{
--cntt[buck[a[x]]];
--buck[a[x]];
++cntt[buck[a[x]]];
}
inline void add(int x)
{
--cntt[buck[a[x]]];
++buck[a[x]];
++cntt[buck[a[x]]];
}
inline void update(int x,int ti)
{
if(e[x].l<=e1[ti].index&&e1[ti].index<=e[x].r)
{
del(a[e1[ti].index]);
add(e1[ti].val);
}
swap(e1[ti].val,a[e1[ti].index]);
}
int main()
{
int n=read(),m=read();
tt=pow(n,0.666);
for(int i=1;i<=n;++i)disperse[++cnt2]=a[i]=read();
for(int i=1;i<=m;++i)
{
int t=read(),t1=read(),t2=read();
if(t==1)
{
e[++cnt].l=t1,e[cnt].r=t2;
e[cnt].p=cnt;e[cnt].ti=cnt1;
}
else e1[++cnt1].index=t1,e1[cnt1].val=t2,disperse[++cnt2]=t2;
}
sort(disperse+1,disperse+cnt2+1);
int tot=unique(disperse+1,disperse+cnt2+1)-disperse-1;
for(int i=1;i<=n;++i)a[i]=lower_bound(disperse+1,disperse+tot+1,a[i])-disperse;
for(int i=1;i<=cnt1;++i)e1[i].val=lower_bound(disperse+1,disperse+tot+1,e1[i].val)-disperse;
sort(e+1,e+cnt+1,cmp);
int curl=1,curr=0,curt=0;
for(int i=1;i<=cnt;++i)
{
int L=e[i].l,R=e[i].r,T=e[i].ti;
while(R>curr)add(++curr);
while(L<curl)add(--curl);
while(R<curr)del(curr--);
while(L>curl)del(curl++);
while(T>curt)update(i,++curt);
while(T<curt)update(i,curt--);
for(ans[e[i].p]=1;cntt[ans[e[i].p]];++ans[e[i].p]);
}
for(int i=1;i<=cnt;++i)printf("%d\n",ans[i]);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,k=1;
char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*k;
}
const int MAXN=1e5+20;
struct node
{
int l,r,val,index,p,ti;
}e[MAXN],e1[MAXN];
int cnt,cnt1,cnt2,tt,buck[MAXN<<1],disperse[MAXN<<1],cntt[MAXN<<1],a[MAXN],ans[MAXN];
inline bool cmp(node s,node s1)
{
if(s.l/tt==s1.l/tt)
{
if(s.r/tt==s1.r/tt) return s.ti<s1.ti;
else return s.r<s1.r;
}
else return s.l<s1.l;
}
inline void del(int x)
{
--cntt[buck[x]];
--buck[x];
++cntt[buck[x]];
}
inline void add(int x)
{
--cntt[buck[x]];
++buck[x];
++cntt[buck[x]];
}
inline void update(int x,int ti)
{
if(e[x].l<=e1[ti].index&&e1[ti].index<=e[x].r)
{
del(a[e1[ti].index]);
add(e1[ti].val);
}
swap(e1[ti].val,a[e1[ti].index]);
}
int main()
{
int n=read(),m=read();
tt=pow(n,0.666);
for(int i=1;i<=n;++i)disperse[++cnt2]=a[i]=read();
for(int i=1;i<=m;++i)
{
int t=read(),t1=read(),t2=read();
if(t==1)
{
e[++cnt].l=t1,e[cnt].r=t2;
e[cnt].p=cnt;e[cnt].ti=cnt1;
}
else e1[++cnt1].index=t1,e1[cnt1].val=t2,disperse[++cnt2]=t2;
}
sort(disperse+1,disperse+cnt2+1);
int tot=unique(disperse+1,disperse+cnt2+1)-disperse-1;
for(int i=1;i<=n;++i)a[i]=lower_bound(disperse+1,disperse+tot+1,a[i])-disperse;
for(int i=1;i<=cnt1;++i)e1[i].val=lower_bound(disperse+1,disperse+tot+1,e1[i].val)-disperse;
sort(e+1,e+cnt+1,cmp);
int curl=1,curr=0,curt=0;
for(int i=1;i<=cnt;++i)
{
int L=e[i].l,R=e[i].r,T=e[i].ti;
while(R>curr)add(a[++curr]);
while(L<curl)add(a[--curl]);
while(R<curr)del(a[curr--]);
while(L>curl)del(a[curl++]);
while(T>curt)update(i,++curt);
while(T<curt)update(i,curt--);
for(ans[e[i].p]=1;cntt[ans[e[i].p]];++ans[e[i].p]);
}
for(int i=1;i<=cnt;++i)printf("%d\n",ans[i]);
return 0;
}
第一份代码a数组写函数里就WA,第二份代码写外面就A了,感觉没啥区别啊