#include <bits/stdc++.h>
using namespace std;
using ll=long long; // 简化long long类型书写

const ll MAXN = 20000000; // 质数筛选最大范围
vector<ll> primes;         // 存储筛出的所有质数
vector<bool> is_prime(MAXN + 1, true); // 标记是否为质数,初始默认是质数

// 欧拉筛(线性筛)预处理质数
void sieve() {
    is_prime[0] = is_prime[1] = false; // 0和1不是质数
    for (ll i = 2; i <= MAXN; ++i) {   // 遍历2~MAXN所有数
        if (is_prime[i]) {
            primes.push_back(i);       // 未被标记则是质数,加入数组
        }
        for (ll p : primes) {          // 用已筛质数标记合数
            if (i * p > MAXN) break;   // 超出范围则终止
            is_prime[i * p] = false;   // 标记i*p为合数
            if (i % p == 0) break;     // 保证仅被最小质因子标记
        }
    }
}

int main() {
    ios::sync_with_stdio(false); // 关闭IO同步,提升速度
    cin.tie(nullptr);            // 解除cin与cout绑定

    sieve(); // 预处理所有质数

    ll T;
    cin >> T;
    while (T--) {                // 处理T次查询
        ll o;
        cin >> o;
        if (o == 1) {            // 操作1:查询第k小质数
            ll k;
            cin >> k;
            cout << primes[k-1] << '\n'; // 数组0索引,取k-1位置
        } else if (o == 2) {     // 操作2:判断x是否为质数
            ll x;
            cin >> x;
            cout << (is_prime[x] ? "YES\n" : "NO\n"); // 直接查标记数组
        }
    }
    return 0;
}