#include <assert.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

#define FIN "voodoo.in"
#define FOUT "voodoo.out"
#define FOK "voodoo.ok"

const int max_n = 1000000;
const int max_val = 100000;

FILE *fin, *fout, *fok;
int n, x, y, score_id = 0;
long long out_cost, ok_cost;
int in_perm[max_n + 1], out_perm[max_n + 1], fr[max_val + 1];

void result(const char *msg, int p) {
    fprintf(stderr, "%s", msg);
    printf("%d", p);

    fclose(fin);
    fclose(fout);
    fclose(fok);

    exit(0);
}

bool are_equal(int *a, int *b, int n) {
    for (int i = 1; i <= n; i++) {
        fr[a[i]]++;
        fr[b[i]]--;
    }

    for (int i = 0; i <= max_val; i++) {
        if (fr[i] != 0) {
            return false;
        }
    }

    return true;
}

long long get_cost(int *perm) {
    long long ans = 0;
    for (int i = x; i <= y; i++) {
        if (LLONG_MAX - ans < 1LL * x * (n - y + 1) * perm[i]) {
            result("Datele de intrare dau overflow pe long long!", 0);
        }
        ans += 1LL * x * (n - y + 1) * perm[i];
    }

    for (int i = 1; i < x; i++) {
        if (LLONG_MAX - ans < 1LL * i * (n - y + 1) * perm[i]) {
            result("Datele de intrare dau overflow pe long long!", 0);
        }
        ans += 1LL * i * (n - y + 1) * perm[i];
    }

    for (int i = y + 1; i <= n; i++) {
        if (LLONG_MAX - ans < 1LL * x * (n - i + 1) * perm[i]) {
            result("Datele de intrare dau overflow pe long long!", 0);
        }
        ans += 1LL * x * (n - i + 1) * perm[i];
    }

    return ans;
}

int main(void) {
    // Initializare fisiere
    fin = fopen(FIN, "r");
    fout = fopen(FOUT, "r");
    fok = fopen(FOK, "r");

    if (fin == NULL) {
        result("Fisier de intrare lipsa!", 0);
    }

    if (fout == NULL) {
        result("Fisier de iesire lipsa!", 0);
    }

    if (fok == NULL) {
        result("Fisier de verificare lipsa!", 0);
    }

    // Citire input
    if (fscanf(fin, "%d%d%d", &n, &x, &y) != 3) {
        result("Fisier de intrare invalid!", 0);
    }

    if (!(1 <= x && x < y && y <= n && n <= max_n)) {
        result(
            "Datele de intrare nu respecta cerinta 1 <= x < y <= n <= 1000000!",
            0);
    }

    for (int i = 1; i <= n; i++) {
        if (fscanf(fin, "%d", &in_perm[i]) != 1) {
            result("Fisier de intrare invalid!", 0);
        }
        if (!(0 <= in_perm[i] && in_perm[i] <= max_val)) {
            result("Datele de intare nu respecta cerinta 0 <= a[i] <= 100000!",
                   0);
        }
    }

    // Citire output
    if (fscanf(fout, "%lld", &out_cost) != 1) {
        result("Fisier de iesire invalid!", 0);
    }

    for (int i = 1; i <= n; i++) {
        if (fscanf(fout, "%d", &out_perm[i]) != 1) {
            result("Fisier de iesire invalid!", 0);
        }
        if (!(0 <= out_perm[i] && out_perm[i] <= max_val)) {
            result("Numerele afisate nu sunt in intervalul [0, 100000]!", 0);
        }
    }

    // Citire ok
    if (fscanf(fok, "%lld", &ok_cost) != 1) {
        result("Fisier de verificare invalid!", 0);
    }
    if (ok_cost < 0) {
        result("Costul de verificare este negativ!", 0);
    }

    // Verificare vectori
    if (!are_equal(out_perm, in_perm, n)) {
        result("Sirul afisat nu este un rearanjament al sirului initial!", 0);
    }

    // Verificare cost
    if (ok_cost == out_cost) {
        score_id += 1;
    }

    // Verificare validitate permutare
    if (get_cost(out_perm) == ok_cost) {
        score_id += 2;
    }

    switch (score_id) {
    case 0: {
        result("Raspuns incorect", 0);
    } break;
    case 1: {
        result("Sirul afisat nu obtine costul minim!", 2);
    } break;
    case 2: {
        result("Costul afisat nu este minim!", 2);
    } break;
    case 3: {
        result("Corect", 4);
    } break;
    }

    return 0;
}

