#include using namespace std; #define rep(i,n) REP(i,0,n) #define REP(i,s,e) for(int i=(s); i<(int)(e); i++) #define repr(i, n) REPR(i, n, 0) #define REPR(i, s, e) for(int i=(int)(s-1); i>=(int)(e); i--) #define pb push_back #define all(r) r.begin(),r.end() #define rall(r) r.rbegin(),r.rend() #define fi first #define se second typedef long long ll; typedef vector vi; typedef vector vl; typedef pair pii; typedef pair pll; const int INF = 1e9; const ll MOD = 1e9 + 7; double EPS = 1e-8; const int MAX_N = 1e6+10; vector primes; vector isPrime(MAX_N, 1); void buildPrimes() { isPrime[0] = isPrime[1] = 0; REP(i, 2, MAX_N) { if(isPrime[i]) { primes.push_back(i); for(int j = i+i; j < MAX_N; j += i) isPrime[j] = false; } } } int f(int n) { if(n < 10) return n; int s = 0; while(n > 0) { s += n%10; n/= 10; } return f(s); } template struct SegTree{ vector dat; int n; const T Default; SegTree(int n_, const T& def) : Default(def){init(n_);} void init(int n_){ n = 1; while(n < n_) n *= 2; dat = vector(2*n-1, Default); } T f(const T& a, const T& b) { return min(a, b); } void update(int k, const T& a){ k += n-1; dat[k] = a; while(k > 0){ k = (k - 1) / 2; dat[k] = f(dat[k * 2 + 1], dat[k * 2 + 2]); } } T query(int a, int b, int k, int l, int r ){ if(r <= a || b <= l) return Default; if(a <= l && r <= b) return dat[k]; T vl = query(a, b, k * 2 + 1, l, (l + r) / 2); T vr = query(a, b, k * 2 + 2, (l + r) / 2, r); return f(vl, vr); } T query(int a, int b) { return query(a, b, 0, 0, n); } }; // #define DEBUG_MODE #ifdef DEBUG_MODE #define dump(x) cout << #x << " : " << x << endl #define LINE cout << "line : " << __LINE__ << endl #define dumpV(v) cout << #v << " : ["; for(auto& t : v) cout << t << ", "; cout<<"]" << endl #define STOP assert(false) #else #define dump(x) ; #define LINE ; #define dumpV(v); #define STOP ; #endif // #define mp make_pair namespace std{ template ostream &operator <<(ostream& out,const pair& a){ out<<'('<> l >> r; ++r; vi v; REP(i, l, r) if(isPrime[i]) v.pb(i); if(v.size() == 1) { cout << v[0] << endl; return 0; } int n = v.size(); vector idx(10, v.size()); SegTree st(v.size()+10, ll(1e18)); st.update(n, n); ll x = -1, y = -1; repr(i, v.size()) { int k = f(v[i]); dump(v[i]); dump(k); ll ma = min((ll)idx[k], st.query(i, idx[k])); ll len = ma - i; if(len > x) { x = len; y = i; } st.update(i, idx[k]); dump(len); dump(y); idx[k] = i; } dump(x); ll ans = (y == -1 ? v[0] : v[y]); cout << ans << endl; return 0; }