题目链接:https://codeforces.com/contest/30/problem/B
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <climits>
#include <cstring>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <deque>
#include <set>
#include <map>
#include <bitset>
#include <unordered_set>
#include <unordered_map>
#include <algorithm>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
static const int INF=0x3f3f3f3f;
static const ll INFL=0x3f3f3f3f3f3f3f3f;
static const db EPS=1e-10;
static const db PI=acos(-1.0);
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(int X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dd,mm,yy;
int x,y,z;
bool check(int a,int b,int c)
{
if(b==0 || b>12) return 0;
if(c%4==0) days[2]=29;
else days[2]=28;
if(a==0 || a>days[b]) return 0;
if(c+18>yy) return 0;
if(c+18<yy) return 1;
if(b>mm) return 0;
if(b<mm) return 1;
if(a>dd) return 0;
return 1;
}
int main()
{
scanf("%d.%d.%d",&dd,&mm,&yy);
scanf("%d.%d.%d",&x,&y,&z);
if(check(x,y,z) || check(x,z,y) || check(y,x,z) || check(y,z,x) || check(z,x,y) || check(z,y,x)) puts("YES");
else puts("NO");
return 0;
}