#include /* #include #include namespace mp = boost::multiprecision; using bint = mp::cpp_int; */ #include #include #include #include #include #include #include #include #include #include #define rep(i,n) for (int i = 0; i < int(n); ++i) #define repp(i,n,m) for (int i = m; i < int(n); ++i) #define repb(i,n) for (int i = int(n)-1; i >= 0; --i) #define fi first #define se second #define endl "\n" using namespace std; using namespace atcoder; using ll = long long; using ld = long double; using P = pair; using PL = pair; using Pxy = pair; using pil = pair; using pli = pair; const int INF = 1001001007; const long long mod1 = 1000000007LL; const long long mod2 = 998244353LL; const ll inf = 2e18; const ld pi = 3.14159265358979323; const ld eps = 1e-7; const char _ = ' '; templateistream &operator>>(istream &is,vector &v){for(auto &e:v)is>>e;return is;} templateostream &operator<<(ostream &os,const vector &v){if(v.size()!=0){rep(i,v.size())os<istream &operator>>(istream &is,vector> &v){for(auto &e:v)is>>e;return is;} templateostream &operator<<(ostream &os,const vector> &v){if(v.size()!=0){for(auto &e:v)os<bool range(T a,T b,T x){return (a<=x&&xbool rrange(T a,T b,T c,T d,T x,T y){return (range(a,c,x)&&range(b,d,y));} templatevoid rev(vector &v){reverse(v.begin(),v.end());} void revs(string &s) {reverse(s.begin(),s.end());} templatevoid sor(vector &v, int f=0){sort(v.begin(),v.end());if(f!=0) rev(v);} templatebool chmin(T &a,const T &b){if(a>b){a=b;return true;}return false;} templatebool chmax(T &a,const T &b){if(avoid eru(vector &v){sor(v);v.erase(unique(v.begin(),v.end()),v.end());} templateT cel(T a,T b){if(a%b==0)return a/b;return a/b +1;} void o(){cout<<"!?"<void o(T a){cout<void o2(T a,U b){cout<void o2(pair a){o2(a.first,a.second);} templatevoid o3(T a,U b,V c){cout<void mout(T a){cout<void dame(bool t, T s){if(!t){cout << s << endl;exit(0);}} void fast_io(){cin.tie(0); ios::sync_with_stdio(0); cout< dx = {0,1,0,-1}; vector dy = {1,0,-1,0}; const string ALP = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const string alp = "abcdefghijklmnopqrstuvwxyz"; const string num = "0123456789"; ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} ll mpow(ll x,ll n,ll m){if(n==0)return 1LL;x%=m;ll a=mpow(x,n/2,m);a=a*a%m;return (n&1)?a*x%m:a;} ll tentou(vector ar){ int n = ar.size(); set st; rep(i,n) st.insert(ar[i]); map mp; int ind = 0; for (ll x : st){ mp[x] = ind; ind++; } fenwick_tree fw(ind); ll ans = 0; rep(i,n){ int a = mp[ar[i]]; ans += i - fw.sum(0,a+1); fw.add(a,1); } return ans; } struct edge{ int from, to, idx; long long cost; edge(int _from = -1, int _to = -1, long long _cost = 1LL, int _idx = -1) : from(_from), to(_to), cost(_cost), idx(_idx) {} }; struct vertex{ vector adj; }; struct Graph{ int n, m; vector ar; void add_edge(int from, int to, long long cost = 1LL){ assert(0 <= from && from < n); assert(0 <= to && to < n); ar[from].adj.emplace_back(edge(from,to,cost)); } void add_dual_edge(int from, int to, long long cost = 1LL){ assert(0 <= from && from < n); assert(0 <= to && to < n); ar[from].adj.emplace_back(edge(from,to,cost)); ar[to].adj.emplace_back(edge(to,from,cost)); } Graph(int _n) : n(_n) , ar(n) {} vector dijkstra(int s){ using pli = pair; priority_queue, greater> pque; vector dist(n,inf); dist[s] = 0LL; pque.push(pli(0,s)); while (!pque.empty()){ pli p = pque.top(); pque.pop(); if (dist[p.second] < p.first) continue; for (edge x : ar[p.second].adj){ if (dist[x.to] > p.first + x.cost){ dist[x.to] = p.first + x.cost; pque.push(pli(dist[x.to],x.to)); } } } return dist; } vector bfs01(int s){ deque que; vector dist(n,inf); dist[s] = 0LL; que.push_front(s); while (!que.empty()){ int p = que.front(); que.pop_front(); for (edge x : ar[p].adj){ if (dist[x.to] > dist[p] + x.cost){ if (x.cost == 0LL) que.push_front(x.to); else que.push_back(x.to); } } } return dist; } vector dfs(int s){ vector ans; vector vis(n,0); _dfs(s,ans,vis); } private: void _dfs(int s, vector &ans, vector &vis){ vis[s]++; for (edge x : ar[s].adj){ if (vis[x.to] == 0){ _dfs(x.to,ans,vis); } } ans.emplace_back(s); } }; struct Tree{ Tree(int _n, int _root = 0) : n(_n), root(_root) { assert(0 <= root && root < n); initialize(); } void add_edge(int from, int to, long long cost = 1LL, int _idx = -1){ assert(0 <= from && from < n); assert(0 <= to && to < n); if (_idx == -1) _idx = m, m++; assert(0 <= _idx && _idx < n-1); assert(edge_idx_cnt[_idx] == 0); edge_idx_cnt[_idx]++; vs[from].adj.emplace_back(edge(from,to,cost,_idx)); es[_idx] = edge(from,to,cost,_idx); } void add_dual_edge(int from, int to, long long cost = 1LL, int _idx = -1){ assert(0 <= from && from < n); assert(0 <= to && to < n); if (_idx == -1) _idx = m, m++; assert(0 <= _idx && _idx < n-1); assert(edge_idx_cnt[_idx] == 0); edge_idx_cnt[_idx]++; vs[from].adj.emplace_back(edge(from,to,cost,_idx)); vs[to].adj.emplace_back(edge(to,from,cost,_idx)); es[_idx] = edge(from,to,cost,_idx); } int size(){return n;} int parent(int v){ assert(0 <= v && v < n); if (is_done_par_rdist_init == false) par_rdist_init(); return par[v]; } int depth(int v){ assert(0 <= v && v < n); if (dep[v] != -1) return dep[v]; if (v == root) return dep[v] = 0; return dep[v] = depth(parent(v)) + 1; } int subtree_size(int v){ assert(0 <= v && v < n); if (sub[v] != 0) return sub[v]; sub[v] = 1; for (edge x : vs[v].adj){ if (x.to != parent(v)) sub[v] += subtree_size(x.to); } return sub[v]; } int lca(int u, int v){ assert(0 <= u && u < n); assert(0 <= v && v < n); if (is_done_lca_init == false) lca_init(); if (depth(u) > depth(v)) swap(u,v); for (int i = 0; i < 30; i++) if ((depth(v) - depth(u)) >> i & 1) v = par2[i][v]; if (u == v) return u; for (int k = 29; k >= 0; k--){ if (par2[k][u] != par2[k][v]) { u = par2[k][u]; v = par2[k][v]; } } return par2[0][u]; } long long dist(int u, int v){ assert(0 <= u && u < n); assert(0 <= v && v < n); if (is_done_par_rdist_init == false) par_rdist_init(); return rdist[u] + rdist[v] - rdist[lca(u,v)] * 2LL; } vector path(int f, int t){ assert(0 <= f && f < n); assert(0 <= t && t < n); int v = lca(f,t); vector fp = {f}; vector tp = {t}; int fn = f, tn = t; while (fn != v){ fn = parent(fn); fp.emplace_back(fn); } while (tn != v){ tn = parent(tn); tp.emplace_back(tn); } for (int i = int(tp.size()) - 2; i >= 0; i--){ fp.emplace_back(tp[i]); } return fp; } vector alldists(int v){ assert(0 <= v && v < n); if (v == 0) return rdist; vector dists(n,1e18); vector vis(n,0); dists[v] = 0LL; queue que; que.push(v); while (!que.empty()){ int p = que.front(); que.pop(); vis[p]++; for (edge x : vs[p].adj){ if (vis[x.to] == 0){ dists[x.to] = dists[p] + x.cost; que.push(x.to); } } } return dists; } vector dfs(int v){ assert(0 <= v && v < n); vector ans; vector vis(n,0); _dfs(v,vis,ans); return ans; } edge to_parent(int v){ assert(0 <= v && v < n && v != root); if (is_done_par_rdist_init == false) par_rdist_init(); return es[epar[v]]; } private: int n; int m; int root; int idx_vhfs; bool is_done_lca_init; bool is_done_par_rdist_init; vector vs; vector es; vector edge_idx_cnt; vector par; vector epar; vector dep; vector sub; vector top; vector rdist; vector> par2; void initialize(){ m = 0; is_done_lca_init = false; is_done_par_rdist_init = false; vs.resize(n); es.resize(n-1); edge_idx_cnt.resize(n-1,0); dep.resize(n,-1); sub.resize(n,0); } void lca_init(){ par2.resize(30,vector(n,-1)); for (int i = 0; i < n; i++) par2[0][i] = parent(i); for (int i = 0; i < 29 ; i++) { for (int j = 0; j < n; j++) { if (par2[i][j] < 0) par2[i+1][j] = -1; else par2[i+1][j] = par2[i][par2[i][j]]; } } is_done_lca_init = true; } void par_rdist_init(){ par.resize(n,-2); epar.resize(n); rdist.resize(n,-1); par[root] = -1; rdist[root] = 0; queue que; que.push(root); while (!que.empty()){ int p = que.front(); que.pop(); for (edge x : vs[p].adj){ if (par[x.to] == -2){ par[x.to] = p; epar[x.to] = x.idx; rdist[x.to] = rdist[p] + x.cost; que.push(x.to); } } } is_done_par_rdist_init = true; } void _dfs(int v, vector &vis, vector &ans){ vis[v]++; for (edge x : vs[v].adj){ if (vis[x.to] == 0) _dfs(x.to,vis,ans); } ans.emplace_back(v); } }; int main(){ ll n, s; cin >> n >> s; yn(cel(s,n) <= 29 && 25 <= s); }