模拟指针,每个元素只会被枚举一次,时间复杂O(n)
简单来说,给每个枚举过的的元素他所在区间的左端点和右端点
每次给了一个区间后
-
如果左右端点没有落到枚举过的区间,那就直接枚举区间内所有元素
-
如果落在枚举过的区间
1.那么使左端点变为所落在区间的右端点
2.右端点变为所落在区间的左端点
循环往复,就可以找到一段没有被枚举过的元素
#include<bits/stdc++.h>
using namespace std;
#define l first
#define r second
typedef pair<int,int> pii ;
int n,q;
int op;
const int maxn=1e5+10;
pii m[maxn];
int f[maxn];
int cnt=0;
void solve(){
cin>>op;
int l,r,x;
if(op==1){
cin>>l>>r;
while(m[r].l!=0){
if(r==m[r].l) break;
r=m[r].l;
}
while(m[l].r!=0){
if(l==m[l].r) break;
l=m[l].r;
}for(int i=l;i<=r;++i){
m[i].l=l;
m[i].r=r;
if(f[i]==0)f[i]=++cnt;
}
}
else{
cin>>x;
cout<<f[x]<<endl;
}
}
int main(){
cin>>n>>q;
while(q--){
solve();
}
return 0;
}