This documentation is automatically generated by online-judge-tools/verification-helper
// verification-helper: PROBLEM http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2308
#include<bits/stdc++.h>
using namespace std;
#define call_from_test
#include "../../tools/chminmax.cpp"
#include "../../tools/drop.cpp"
#include "../../io/precision.cpp"
#include "../../geometry/projectilemotion.cpp"
#undef call_from_test
using D = double;
struct Point{
D x,y;
Point(){}
Point(D x,D y):x(x),y(y){}
};
istream &operator>>(istream &is,Point &p){
is>>p.x>>p.y;
return is;
}
signed main(){
int n;
D v;
cin>>n>>v;
Point t;
cin>>t;
vector<Point> ps(n),qs(n);
for(int i=0;i<n;i++) cin>>ps[i]>>qs[i];
for(int i=0;i<n;i++) chmin(qs[i].x,t.x);
D g=9.8;
if(t.x==0){
D ti=v/g;
D y=v*ti-g/2*ti*ti;
if(y>=t.y) drop("Yes");
drop("No");
}
const D EPS = 1e-10;
vector<D> cand;
auto push=
[&](Point s){
for(auto pq:projectile_motion(v,g,s.x,s.y)){
D d=pq.first;
cand.emplace_back(d);
cand.emplace_back(d+EPS);
cand.emplace_back(d-EPS);
}
};
for(int i=0;i<n;i++){
if(ps[i].x>=t.x) continue;
push(ps[i]);
push(qs[i]);
push(Point(ps[i].x,qs[i].y));
push(Point(qs[i].x,ps[i].y));
}
push(t);
auto getY=
[&](D p,D q,D x){
D ti=x/p;
return q*ti-g/2*ti*ti;
};
auto in=
[&](int k,D p,D q)->int{
if(ps[k].x>=t.x) return 0;
if(ps[k].y<getY(p,q,ps[k].x) && getY(p,q,ps[k].x)<qs[k].y) return 1;
if(ps[k].y<getY(p,q,qs[k].x) && getY(p,q,qs[k].x)<qs[k].y) return 1;
if(ps[k].y<getY(p,q,ps[k].x) && getY(p,q,qs[k].x)<ps[k].y) return 1;
if(ps[k].y<getY(p,q,qs[k].x) && getY(p,q,ps[k].x)<ps[k].y) return 1;
if(qs[k].y<getY(p,q,ps[k].x) && getY(p,q,qs[k].x)<qs[k].y) return 1;
if(qs[k].y<getY(p,q,qs[k].x) && getY(p,q,ps[k].x)<qs[k].y) return 1;
D ti=q/g;
Point top(p*ti,getY(p,q,p*ti));
if(ps[k].x<top.x && top.x<qs[k].x &&
ps[k].y<top.y && top.y<qs[k].y) return 1;
return 0;
};
for(D p:cand){
D q=sqrt(v*v-p*p);
if(getY(p,q,t.x)<t.y) continue;
int flg=1;
for(int i=0;i<n;i++)
if(in(i,p,q)) flg=0;
if(flg) drop("Yes");
}
cout<<"No"<<endl;
return 0;
}
#line 1 "test/aoj/2308.test.cpp"
// verification-helper: PROBLEM http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2308
#include<bits/stdc++.h>
using namespace std;
#define call_from_test
#line 1 "tools/chminmax.cpp"
#line 3 "tools/chminmax.cpp"
using namespace std;
#endif
//BEGIN CUT HERE
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
//END CUT HERE
#ifndef call_from_test
signed main(){
return 0;
}
#endif
#line 1 "tools/drop.cpp"
#line 3 "tools/drop.cpp"
using namespace std;
#endif
//BEGIN CUT HERE
template<typename T> void drop(const T &x){cout<<x<<endl;exit(0);}
//END CUT HERE
#ifndef call_from_test
//INSERT ABOVE HERE
signed main(){
return 0;
}
#endif
#line 1 "io/precision.cpp"
#line 3 "io/precision.cpp"
using namespace std;
#endif
//BEGIN CUT HERE
struct Precision{
Precision(){
cout<<fixed<<setprecision(12);
}
}precision_beet;
//END CUT HERE
#ifndef call_from_test
signed main(){
return 0;
}
#endif
#line 1 "geometry/projectilemotion.cpp"
#line 3 "geometry/projectilemotion.cpp"
using namespace std;
#endif
//BEGIN CUT HERE
// throw from origin to (x,y) with verocity v (x>0)
// g: gravity
template<typename D>
vector< pair<D, D> > projectile_motion(D v,D g,D x,D y){
D a=x*x+y*y;
D b=g*x*x*y-v*v*x*x;
D c=g*g*x*x*x*x/4;
if(b*b<4*a*c) return {};
vector< pair<D, D> > res;
{
D p=(-b+sqrt(b*b-4*a*c))/(2*a);
if(0<p and p<v*v) res.emplace_back(sqrt(p),sqrt(v*v-p));
}
{
D p=(-b-sqrt(b*b-4*a*c))/(2*a);
if(0<p and p<v*v) res.emplace_back(sqrt(p),sqrt(v*v-p));
}
return res;
}
//END CUT HERE
#ifndef call_from_test
//INSERT ABOVE HERE
signed main(){
return 0;
}
#endif
#line 11 "test/aoj/2308.test.cpp"
#undef call_from_test
using D = double;
struct Point{
D x,y;
Point(){}
Point(D x,D y):x(x),y(y){}
};
istream &operator>>(istream &is,Point &p){
is>>p.x>>p.y;
return is;
}
signed main(){
int n;
D v;
cin>>n>>v;
Point t;
cin>>t;
vector<Point> ps(n),qs(n);
for(int i=0;i<n;i++) cin>>ps[i]>>qs[i];
for(int i=0;i<n;i++) chmin(qs[i].x,t.x);
D g=9.8;
if(t.x==0){
D ti=v/g;
D y=v*ti-g/2*ti*ti;
if(y>=t.y) drop("Yes");
drop("No");
}
const D EPS = 1e-10;
vector<D> cand;
auto push=
[&](Point s){
for(auto pq:projectile_motion(v,g,s.x,s.y)){
D d=pq.first;
cand.emplace_back(d);
cand.emplace_back(d+EPS);
cand.emplace_back(d-EPS);
}
};
for(int i=0;i<n;i++){
if(ps[i].x>=t.x) continue;
push(ps[i]);
push(qs[i]);
push(Point(ps[i].x,qs[i].y));
push(Point(qs[i].x,ps[i].y));
}
push(t);
auto getY=
[&](D p,D q,D x){
D ti=x/p;
return q*ti-g/2*ti*ti;
};
auto in=
[&](int k,D p,D q)->int{
if(ps[k].x>=t.x) return 0;
if(ps[k].y<getY(p,q,ps[k].x) && getY(p,q,ps[k].x)<qs[k].y) return 1;
if(ps[k].y<getY(p,q,qs[k].x) && getY(p,q,qs[k].x)<qs[k].y) return 1;
if(ps[k].y<getY(p,q,ps[k].x) && getY(p,q,qs[k].x)<ps[k].y) return 1;
if(ps[k].y<getY(p,q,qs[k].x) && getY(p,q,ps[k].x)<ps[k].y) return 1;
if(qs[k].y<getY(p,q,ps[k].x) && getY(p,q,qs[k].x)<qs[k].y) return 1;
if(qs[k].y<getY(p,q,qs[k].x) && getY(p,q,ps[k].x)<qs[k].y) return 1;
D ti=q/g;
Point top(p*ti,getY(p,q,p*ti));
if(ps[k].x<top.x && top.x<qs[k].x &&
ps[k].y<top.y && top.y<qs[k].y) return 1;
return 0;
};
for(D p:cand){
D q=sqrt(v*v-p*p);
if(getY(p,q,t.x)<t.y) continue;
int flg=1;
for(int i=0;i<n;i++)
if(in(i,p,q)) flg=0;
if(flg) drop("Yes");
}
cout<<"No"<<endl;
return 0;
}