#pragma comment(linker, "/STACK:1000000000")
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <string.h>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <sstream>

#include "testlib.h"

using namespace std;

#define pb push_back
#define mp make_pair
#define fs first
#define sc second
#define PI 3.1415926535897932384626433832795

int main(int argc, char **argv)
{
    registerTestlibCmd(argc, argv);

    int n = inf.readInt();
    vector <int> years, ansv;
    vector <int> L[2], R[2];

    for (int i = 0; i < n; i++) {
        years.pb(inf.readInt());
    }
    int k = inf.readInt();
    L[0].resize(k);
    L[1].resize(k);
    R[0].resize(k);
    R[1].resize(k);
    for (int i = 0; i < k; i++) {
        L[0][i] = inf.readInt();
        R[0][i] = inf.readInt();
        L[1][i] = inf.readInt();
        R[1][i] = inf.readInt();
    }

    int jBest = ans.readInt();
    int jAns = 0;
    if (jBest != 0) {
    	jAns = ans.readInt();
    }	
    int cBest = ouf.readInt();
    int cAns = 0;
    if (cBest < 0 || cBest > k)
        quitf(_pe, "Не существует ученого с номером %d.", cBest);
    string str;
    if (cBest != 0) {
        cAns = ouf.readInt();
        if (cAns < 0 || cAns > n)
            quitf(_wa, "Ответ %d неверен.", cAns);
        str = ouf.readWord();
        if (int(str.size()) != n)
            quitf(_pe, "Длина выведенного ответа %d, но количество лет в тесте - %d.", str.size(), n);
        for (int i = 0; i < n; i++)
            if (str[i] != '1' && str[i] != '2')
                quitf(_pe, "Недопустимый символ на позиции %d.", i + 1);
    }

    if (jBest == 0 && cBest == 0)
        quitf(_ok, "Ни для одного ученого не существует корректного распределения.\n");
    if (jBest != 0 && cBest == 0)
        quitf(_wa, "Участник не нашел корректного распределения ни для одного историка, но жюри нашло для %d.\n", jBest);

    int lst[2];
    lst[0] = lst[1] = -1;
    int cnt = 0;
    int lval = -1;
    for (int i = 0; i < n; i++) {
        int cur = str[i] - '1';
        cnt += (lval == cur);
        lval = cur;
        if (lst[cur] != -1 && (years[i] - years[lst[cur]] < L[cur][cBest - 1] || years[i] - years[lst[cur]] > R[cur][cBest - 1]))
            quitf(_wa, "В предъявленном ответе нарушены ограничения на L = %d и R = %d для позиций %d и %d.",
                L[cur][cBest - 1], R[cur][cBest - 1], lst[cur] + 1, i + 1);
    	lst[cur] = i;
    }

    if (cnt != cAns)
        quitf(_wa, "Предъявленное распределение не соответствует заявленному ответу. Указан ответ %d, ответ для указанного распределения - %d", cAns, cnt);
    if (cAns > jAns)
        quitf(_wa, "Ответ жюри лучше ответа участника. Ответ жюри: %d. Ответ участника: %d. Оптимальный ответ достигается на ученом %d\n", jAns, cAns, jBest);
    if (cAns < jAns)
        quitf(_fail, "Ой-ой, кажется вышла неудача! Ответ жюри: %d, ответ участника: %d, для ученого номер %d.\n", jAns, cAns, cBest);

    quitf(_ok, "Ответ верен. Один из оптимальных ученых: %d, величина ответа: %d\n", cBest, cAns);

    return 0;
}
