#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define all(a) a.begin() ,a.end()
vector<ll> sieve(ll n)
{
vector<bool> prime(n + 1, true);
prime[0] = false;
prime[1] = false;
for (ll i = 2; i*i <= n; i++) {
// If prime[i] is not changed, then it
// is a prime
if (prime[i]) {
// Update all multiples of p
for (ll j = i * i; j <= n; j += i)
prime[j] = false;
}
}
// push all the primes into the vector ans
vector<ll> ans;
for (ll i = 0; i < n; i++)
if (prime[i])
ans.push_back(i);
return ans;
}
vector<ll> sieveRange(ll l , ll r){
ll sqrt_r = sqrt(r);
vector<ll>smallPrimes = sieve(sqrt_r);
vector<bool>isPrime(r-l+1,true);
for(ll p :smallPrimes){
ll start = max(p*p , (l+p-1)/p*p);
for(int j=start;j<=r;j+=p){
isPrime[j-l]=false;
}
}
vector<ll>ans;
for(int i=0;i<isPrime.size();i++){
if(isPrime[i] && (i+l)>1){
ans.push_back(i+l);
}
}
return ans;
}
int main() {
ll l =12;
ll r = 50;
vector<ll>ans = sieveRange(l,r);
for(int x:ans)cout<<x<<" ";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGludCBsbDsKI2RlZmluZSBhbGwoYSkgYS5iZWdpbigpICxhLmVuZCgpCgp2ZWN0b3I8bGw+IHNpZXZlKGxsIG4pIAp7IAoJdmVjdG9yPGJvb2w+IHByaW1lKG4gKyAxLCB0cnVlKTsgCiAJcHJpbWVbMF0gPSBmYWxzZTsgCglwcmltZVsxXSA9IGZhbHNlOyAKIAlmb3IgKGxsIGkgPSAyOyBpKmkgPD0gbjsgaSsrKSB7IAogCgkJLy8gSWYgcHJpbWVbaV0gaXMgbm90IGNoYW5nZWQsIHRoZW4gaXQgCgkJLy8gaXMgYSBwcmltZSAKCQlpZiAocHJpbWVbaV0pIHsgCiAKCQkJLy8gVXBkYXRlIGFsbCBtdWx0aXBsZXMgb2YgcCAKCQkJZm9yIChsbCBqID0gaSAqIGk7IGogPD0gbjsgaiArPSBpKSAKCQkJCXByaW1lW2pdID0gZmFsc2U7IAoJCX0gCgl9IAogCgkvLyBwdXNoIGFsbCB0aGUgcHJpbWVzIGludG8gdGhlIHZlY3RvciBhbnMgCgl2ZWN0b3I8bGw+IGFuczsgCglmb3IgKGxsIGkgPSAwOyBpIDwgbjsgaSsrKSAKCQlpZiAocHJpbWVbaV0pIAoJCQlhbnMucHVzaF9iYWNrKGkpOyAKCXJldHVybiBhbnM7IAp9IAoKdmVjdG9yPGxsPiBzaWV2ZVJhbmdlKGxsIGwgLCBsbCByKXsKCWxsIHNxcnRfciA9IHNxcnQocik7Cgl2ZWN0b3I8bGw+c21hbGxQcmltZXMgPSBzaWV2ZShzcXJ0X3IpOwoJdmVjdG9yPGJvb2w+aXNQcmltZShyLWwrMSx0cnVlKTsKCWZvcihsbCBwIDpzbWFsbFByaW1lcyl7CgkJbGwgc3RhcnQgPSBtYXgocCpwICwgKGwrcC0xKS9wKnApOwoJCWZvcihpbnQgaj1zdGFydDtqPD1yO2orPXApewoJCQlpc1ByaW1lW2otbF09ZmFsc2U7CgkJfQoJfQoJdmVjdG9yPGxsPmFuczsKCWZvcihpbnQgaT0wO2k8aXNQcmltZS5zaXplKCk7aSsrKXsKCQlpZihpc1ByaW1lW2ldICYmIChpK2wpPjEpewoJCQlhbnMucHVzaF9iYWNrKGkrbCk7CgkJfQoJfQoJcmV0dXJuIGFuczsKfQoKaW50IG1haW4oKSB7CglsbCBsID0xMjsKCWxsIHIgPSA1MDsKCXZlY3RvcjxsbD5hbnMgPSBzaWV2ZVJhbmdlKGwscik7Cglmb3IoaW50IHg6YW5zKWNvdXQ8PHg8PCIgIjsKCXJldHVybiAwOwp9