以下是代码,我卡了几遍#15都过不去
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
void read(int &x){
char c=getchar();
int k=1;
while(c<'0'||c>'9') {if(c=='-') k=-1;c=getchar();}
for(x=0;c>='0'&&c<='9';c=getchar())
x=x*10+c-'0';
x*=k;
}
const int N=3e5;
int n,m,k,q,s,ans,x,y,l,r,op;
int c,d,color[N+5];
struct fox{
vector<int> vec;int num;
}a[N+5];
int main(){
read(n);read(m);
for(int i=1;i<=N;i++){
a[i].vec.push_back(0);
}
for(int i=1;i<=n;i++){
read(x);
color[i]=x;
a[x].num++;
a[x].vec.push_back(i);
}
for(int i=1;i<=N;i++){
sort(a[i].vec.begin(),a[i].vec.end());
}
while(m--){
read(op);read(l);
if(op==2){
r=l+1;
if(color[l]==color[r]) continue;
x=color[l];y=color[r];
swap(color[l],color[r]);
a[x].vec.erase(lower_bound(a[x].vec.begin(),a[x].vec.end(),l));
a[y].vec.erase(lower_bound(a[y].vec.begin(),a[y].vec.end(),r));
a[x].vec.insert(lower_bound(a[x].vec.begin(),a[x].vec.end(),r),r);
a[y].vec.insert(lower_bound(a[y].vec.begin(),a[y].vec.end(),l),l);
}
else{
read(r);read(c);
y=upper_bound(a[c].vec.begin(),a[c].vec.end(),r)-a[c].vec.begin()-1;
x=lower_bound(a[c].vec.begin(),a[c].vec.end(),l)-a[c].vec.begin();
if(l>r){
printf("0\n");
}
else{
printf("%d\n",y-x+1);
}
}
}
return 0;
}
哪位神仙能告诉我怎么卡常?
只要卡常就行