Problem:
Age Difference

A trick of fate caused Hatsumi and Taku to come to know each other. To keep the encounter in memory, they decided to calculate the difference between their ages. But the difference in ages varies depending on the day it is calculated. While trying again and again, they came to notice that the difference of their ages will hit a maximum value even though the months move on forever.

Given the birthdays for the two, make a program to report the maximum difference between their ages. The age increases by one at the moment the birthday begins. If the birthday coincides with the 29th of February in a leap year, the age increases at the moment the 1st of March arrives in non-leap years.

Input

The input is given in the following format.

y_1 m_1 d_1
y_2 m_2 d_2

The first and second lines provide Hatsumi’s and Taku’s birthdays respectively in year y_i (1 ≤ y_i ≤ 3000), month m_i (1 ≤ m_i ≤ 12), and day d_i (1 ≤ d_i ≤ Dmax) format. Where Dmax is given as follows:

28 when February in a non-leap year

29 when February in a leap-year

30 in April, June, September, and November

31 otherwise.

It is a leap year if the year represented as a four-digit number is divisible by 4. Note, however, that it is a non-leap year if divisible by 100, and a leap year if divisible by 400.

Output

Output the maximum difference between their ages.

Sample Input 1

1999 9 9
2001 11 3

Sample Output 1

3

In this example, the difference of ages between them in 2002 and subsequent years is 3 on the 1st of October, but 2 on the 1st of December.

Sample Input 2

2008 2 29
2015 3 1

Sample Output 2

8

In this example, the difference of ages will become 8 on the 29th of February in and later years than 2016.

Solution in C# (judge verdict: Accepted)

using System.Collections.Generic;
using System.Linq;
using static System.Math;
using System;

public class P
{
    public int y { get; set; }
    public int m { get; set; }
    public int d { get; set; }
}

public class hello
{
    public static void Main()
    {
        var z = new P[2];
        for (int i = 0; i < 2; i++)
        {
            string[] line = Console.ReadLine().Trim().Split(' ');
            z[i] = new P { y = int.Parse(line[0]), m = int.Parse(line[1]), d = int.Parse(line[2]) };
        }
        var ps = z.OrderBy(x => x.y).ThenBy(x => x.m).ThenBy(x => x.d).ToArray();
        var a = ps[0];
        var b = ps[1];
        var a1 = new List<int>();
        var b1 = new List<int>();
        if ((a.m == 2 && a.d == 29) | (b.m == 2 && b.d == 29))
        {
             a1 = getAge(a.y, a.m, a.d, 2996);
             b1 = getAge(b.y, b.m, b.d, 2996);
        }
        else
        {
             a1 = getAge(a.y, a.m, a.d,3000);
             b1 = getAge(b.y, b.m, b.d, 3000);
        }
        var ans = -1;
        for (int i = 0; i < a1.Count(); i++)
            ans = Max(ans, a1[i] - b1[i]);
        Console.WriteLine(ans);
    }
    public static List<int> getAge(int y, int m, int d, int yyyy)
    {
        var ans = new List<int>();
        var bd = new DateTime(y, m, d);
        var mo = new int[] { 1, 3, 5, 7, 8, 10, 12 };
        foreach (var x in mo)
        {
            for (int i = 1; i <= 31; i++)
            {
                var now = new DateTime(yyyy, x, i);
                var age = now.Year - bd.Year;
                if (bd > now.AddYears(-age)) age--;
                ans.Add(age);
            }
        }
        var mo2 = new int[] { 4, 6, 9, 11 };
        foreach (var x in mo2)
        {
            for (int i = 1; i <= 30; i++)
            {
                var now = new DateTime(yyyy, x, i);
                var age = now.Year - bd.Year;
                if (bd > now.AddYears(-age)) age--;
                ans.Add(age);
            }
        }
        var feb = yyyy == 3000 ? 28 : 29;
        for (int i = 1; i <= feb; i++)
        {
            var now = new DateTime(yyyy, 2, i);
            var age = now.Year - bd.Year;
            if (bd > now.AddYears(-age)) age--;
            ans.Add(age);
        }
        return ans;
    }
}