Problem:
Problem B: Hating Crowd

Problem

ニート君は1年12ヶ月毎月30日まで計360日の世界線で暮らしています。その世界では毎年同じ日程のN個の連休が世界中の人に適用されていました。連休iはMi月Di日から始まる連続したVi日間です。

ニート君はNEETなので連休に関係なく毎日休みです。ある日ニート君は珍しく出かけようと思いましたが、人混みが嫌いなので、連休の影響で混雑する日はなるべく外に出たくありません。そこで、ニート君は以下の方法で各日の混雑度を計算し、混雑度が一番小さい日を探そうとしています。

ある日付xが、連休iによって受ける影響の度合を表す数値は、日付xが連休iの中に含まれていればSiであり、そうでなければ、 max( 0, Si − min ( xから連休iの初日までの日数 , 連休iの最終日からxまでの日数 ) )である

ある日付xの混雑度は、N個の連休から受ける影響の度合の中で、最も大きく受ける影響の度合となる

1年の中で一番小さい混雑度を出力してください。 ただし、連休iは年を跨ぐ事があります。また、連休の日程は重複する事があります。

Input

入力は以下の形式で与えられる。

N
M1 D1 V1 S1
M2 D2 V2 S2
...
MN DN VN SN

1行目に整数Nが与えられる。

2行目からN+1行目に整数Mi, Di, Vi, Siが空白区切りで与えられる。（1 ≤ i ≤ N）

Constraints

入力は以下の条件を満たす。

1 ≤ N ≤ 100

1 ≤ Mi ≤ 12

1 ≤ Di ≤ 30

1 ≤ Vi, Si ≤ 360

Output

一番小さい混雑度を1行に出力する。

Sample Input 1

1
1 1 359 1

Sample Output 1

0

Sample Input 2

2
2 4 25 306
1 9 7 321

Sample Output 2

158

Sample Input 3

8
2 9 297 297
8 6 359 211
8 16 28 288
7 9 113 143
3 18 315 190
10 18 277 300
9 5 276 88
3 5 322 40

Sample Output 3

297

Solution in C# (judge verdict: Accepted)

using static System.Math;
using System;

public class Hello
{
    public static void Main()
    {
        var c = new int[361];
        var n = int.Parse(Console.ReadLine().Trim());
        for (int i = 0; i < n; i++)
        {
            string[] line = Console.ReadLine().Trim().Split(' ');
            var m = int.Parse(line[0]);
            var d = int.Parse(line[1]);
            var a = int.Parse(line[2]);
            var s = int.Parse(line[3]);
            setC(c, m, d, a, s);
        }
        var ans = getAns(c);
        Console.WriteLine(ans);
    }
    static int getAns(int[] c)
    {
        var ans = int.MaxValue;
        for (int i = 1; i <= 360; i++) ans = Min(ans, c[i]);
        return ans;
    }
    static void setC(int[] c, int m, int d, int a, int s)
    {
        var w = (m - 1) * 30 + d;
        for (int i = 1; i < s; i++)
        {
            var t = w - i;
            while (t < 1) t += 360;
            c[t] = Max(c[t], s - i);
            var t2 = w + a - 1 + i;
            while (t2 > 360) t2 -= 360;
            c[t2] = Max(c[t2], s - i);
        }
        var imax = w + a - 1;
        for (int i = w; i <= imax; i++)
            if (i > 360) c[i - 360] = Max(c[i - 360], s);
            else c[i] = Max(c[i], s);
    }
}