func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 200005;   queue<int> q;   priority_queue<pair<int, int> > Q;   vector<pair<int, int> > V[maxn];   struct edge {     int obj, last;   } e[maxn];   int n, N, m, p, top, cnt, point[maxn], in[maxn], ord[maxn], L[maxn], H[maxn],       ans[maxn];   bool vis[maxn];   void add(int x, int y) {     cnt++;     e[cnt].obj = y;     e[cnt].last = point[x];     point[x] = cnt;   }   void Bye() {     puts( -1 );     exit(0);   }   int main() {     scanf( %d%d%d , &n, &m, &p);     for (int i = 1, x; i <= n; i++) {       scanf( %d , &x);       if (x)         L[i] = x, H[i] = x;       else         L[i] = 1, H[i] = p;     }     for (int i = 1, x, y; i <= m; i++) {       scanf( %d%d , &x, &y);       add(x, y);       in[y]++;     }     for (int i = 1; i <= n; i++)       if (!in[i]) q.push(i), ord[++N] = i, vis[i] = true;     while (!q.empty()) {       int u = q.front();       q.pop();       for (int i = point[u], v; i; i = e[i].last) {         v = e[i].obj;         in[v]--;         if (!in[v]) q.push(v), ord[++N] = v, vis[v] = true;       }     }     for (int i = 1; i <= n; i++)       if (!vis[i]) Bye();     for (int i = 1, u; i <= n; i++) {       u = ord[i];       for (int j = point[u], v; j; j = e[j].last) {         v = e[j].obj;         H[v] = min(H[v], H[u] - 1);       }     }     for (int i = n, u; i >= 1; i--) {       u = ord[i];       for (int j = point[u], v; j; j = e[j].last) {         v = e[j].obj;         L[u] = max(L[u], L[v] + 1);       }     }     for (int i = 1; i <= n; i++)       if (L[i] > H[i]) Bye();     for (int i = 1; i <= n; i++) V[H[i]].push_back(pair<int, int>(L[i], i));     top = p;     while (top) {       for (int i = 0, I = V[top].size(); i < I; i++) Q.push(V[top][i]);       if (Q.empty()) Bye();       ans[Q.top().second] = top;       Q.pop();       while (!Q.empty() && Q.top().first == top) {         ans[Q.top().second] = top;         Q.pop();       }       top--;     }     for (int i = 1; i < n; i++) printf( %d  , ans[i]);     printf( %d n , ans[n]);     return 0;   }   