题目大意:每次你可以使一个数失效,或者询问大于该数的第一个有效数是哪个数字。

题目思路:考虑并查集,由于n与x太大,所以用map的并查集,undorered map不会超时 否则普通map会t

ac:

 

#include<bits/stdc++.h>
#define ll long long
#include <stdio.h>
#include <algorithm>
#pragma GCC optimize(2)
using namespace std;
const int maxn=1e6+1000;
const ll INF=10000000000;
inline ll read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
ll n,m;
unordered_map<int,int>mp;
int Find(int y)
{
   if(!mp.count(y)) return y;
   return mp[y]=Find(mp[y]);
 }
int main()
{
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;scanf("%d%d",&x,&y);
        if(x==1)
        {
            if(!mp.count(y)) mp[y]=y+1;
            else mp[y]=mp[y+1];
        }
        else
            printf("%d\n",Find(y));
    }
    return 0;
}

总结:

1.undoreredmap比map速度要快

2.判断一个数是否在map中可以用 mp.count 比 if(mp[x]) 明显要快