#include <stdio.h> #include <stdlib.h> struct keiro { int S; int T; int Y; int M; }; int cmp(const void* a, const void* b) { struct keiro *c = (struct keiro*)a; struct keiro *d = (struct keiro*)b; if (c->S == d->S) { return (c->T - d->T); } else { return (c->S - d->S); } } int main() { int N, C, V, i; struct keiro *keiro; scanf("%d", &N); scanf("%d", &C); scanf("%d", &V); keiro = (struct keiro*)malloc(sizeof(struct keiro)*V); for (i=0; i<V; i++) scanf("%d", &(keiro[i].S)); for (i=0; i<V; i++) scanf("%d", &(keiro[i].T)); for (i=0; i<V; i++) scanf("%d", &(keiro[i].Y)); for (i=0; i<V; i++) scanf("%d", &(keiro[i].M)); qsort(keiro, V, sizeof(struct keiro), cmp); struct keiro_start { int pos; int renge; struct keiro *keiro; }; struct keiro_start *keiro_start = (struct keiro_start*)malloc(sizeof(struct keiro_start )*N); for (i=0; i<N; i++) keiro_start[i].renge = 0; for (i=0; i<V; i++) keiro_start[keiro[i].S - 1].renge ++; keiro_start[0].pos = 0; for (i=1; i<N; i++) keiro_start[i].pos = keiro_start[i-1].pos + keiro_start[i-1].renge; for (i=0; i<N; i++) if (keiro_start[i].renge == 0) { keiro_start[i].keiro = 0; } else { keiro_start[i].keiro = &(keiro[keiro_start[i].pos]); } int check_jikan; int jikan = 0; for (i=0; i<V; i++) jikan += keiro[i].M; jikan++; check_jikan = jikan; struct mati { int no; int Y; int M; int keiro_i; int keiro_n; struct keiro *keiro; }; struct mati *mati = (struct mati*)malloc(sizeof(struct mati)*N); struct mati *mati_p = mati; mati_p->no = 1; mati_p->Y = C; mati_p->M = 0; mati_p->keiro_i = 0; mati_p->keiro_n = keiro_start[mati_p->no - 1].renge; mati_p->keiro = keiro_start[mati_p->no - 1].keiro; struct mati *mati_from = 0; while (mati_p->keiro != 0 && mati_p->Y >= 0 && mati_p->M < jikan) { mati_from = mati_p; mati_p++; mati_p->no = mati_from->keiro->T; mati_p->Y = mati_from->Y - mati_from->keiro->Y; mati_p->M = mati_from->M + mati_from->keiro->M; mati_p->keiro_i = 0; mati_p->keiro_n = keiro_start[mati_p->no - 1].renge; mati_p->keiro = keiro_start[mati_p->no - 1].keiro; } while (1) { if (mati_p->no == N) { if (mati_p->Y >= 0) { if (mati_p->M < jikan) { jikan = mati_p->M; } } } while (1) { if (mati_p == mati) { goto END; } else { mati_p--; mati_p->keiro_i++; if (mati_p->keiro_i < mati_p->keiro_n) { mati_p->keiro++; break; } else { continue; } } } while (mati_p->keiro != 0 && mati_p->Y >= 0 && mati_p->M < jikan) { mati_from = mati_p; mati_p++; mati_p->no = mati_from->keiro->T; mati_p->Y = mati_from->Y - mati_from->keiro->Y; mati_p->M = mati_from->M + mati_from->keiro->M; mati_p->keiro_i = 0; mati_p->keiro_n = keiro_start[mati_p->no - 1].renge; mati_p->keiro = keiro_start[mati_p->no - 1].keiro; } } END: if (jikan == check_jikan) { printf("%d\n", -1); } else { printf("%d\n", jikan); } return 0; }