Problem:
Grading

Write a program which reads a list of student test scores and evaluates the performance for each student.

The test scores for a student include scores of the midterm examination m (out of 50), the final examination f (out of 50) and the makeup examination r (out of 100). If the student does not take the examination, the score is indicated by -1.

The final performance of a student is evaluated by the following procedure:

If the student does not take the midterm or final examination, the student's grade shall be F.

If the total score of the midterm and final examination is greater than or equal to 80, the student's grade shall be A.

If the total score of the midterm and final examination is greater than or equal to 65 and less than 80, the student's grade shall be B.

If the total score of the midterm and final examination is greater than or equal to 50 and less than 65, the student's grade shall be C.

If the total score of the midterm and final examination is greater than or equal to 30 and less than 50, the student's grade shall be D. However, if the score of the makeup examination is greater than or equal to 50, the grade shall be C.

If the total score of the midterm and final examination is less than 30, the student's grade shall be F.

Input

The input consists of multiple datasets. For each dataset, three integers m, f and r are given in a line.

The input ends with three -1 for m, f and r respectively. Your program should not process for the terminal symbols.

The number of datasets (the number of students) does not exceed 50.

Output

For each dataset, print the grade (A, B, C, D or F) in a line.

Sample Input

40 42 -1
20 30 -1
0 2 -1
-1 -1 -1

Sample Output

A
C
F

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ITP1_7_A2
{
    class Program
    {
        static void Main(string[] args)
        {
            //中間試験の点数m、期末試験の点数f、再試験の点数r
            //m,f≤50、r≤100
            //試験を受けていない場合　点数は-1

            //F：中間試験と期末試験のいずれかを欠席 or 中間試験と期末試験の合計が30未満
            //A：中間試験と期末試験の合計が80以上
            //B：中間試験と期末試験の合計が65以上80未満
            //C：中間試験と期末試験の合計が50以上65未満
            //D：中間試験と期末試験の合計が30以上50未満　再試が50以上でC
            ///////////////////////////////////////////////////////////////////////////

            //以下の手順を繰り返す

            Score judge= new Score();
            List<string> record = new List<string>();       //成績を格納するString型Listの変数recordを宣言

            while (true)                                    //break条件にならない限り以下を繰り返す
            {
                string[] score = Console.ReadLine().Split(' ');
                int m = int.Parse(score[0]);
                int f = int.Parse(score[1]);
                int r = int.Parse(score[2]);

                //m,f,rがすべて-1の時　処理を終了
                if (m == -1 && f == -1 && r == -1)
                {
                    break;
                }

                //そうでないとき
                else
                {
                    judge.ScoreJudge(m, f, r, record);
                }
            }
            foreach (string i in record)
            {
                Console.WriteLine(i);
            }
        }
    }
    class Score
    {
        public void ScoreJudge(int m, int f, int r, List<string> record)
        {
            if (m + f < 30 || m == -1 || f == -1)    //Fの場合
            {
                record.Add("F");
            }

            else if (80 <= m + f)                             //Aの場合
            {
                record.Add("A");
            }

            else if (65 <= m + f && m + f < 80)         //Bの場合
            {
                record.Add("B");
            }

            else if (50 <= m + f && m + f < 65)         //Cの場合
            {
                record.Add("C");
            }

            else if (30 <= m + f && m + f < 50)         //Dの場合
            {
                if (50 <= r)
                {
                    record.Add("C");
                }
                else
                {
                    record.Add("D");
                }
            }
        }
    }
}