模拟指针,每个元素只会被枚举一次,时间复杂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;
}