func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 2000100;   const int inf = 1000000007;   int dp[N][2], n, m[2], t, tot = 0, g[N][2], path[N], ans[N];   struct nd {     int d, id;   } a[N][2];   struct element {     int d, id[2];   } b[N];   struct point {     int x, y;   } po[N];   inline int read() {     int x = 0;     char ch = getchar();     while ((ch <  0 ) || (ch >  9 )) ch = getchar();     while ((ch >=  0 ) && (ch <=  9 )) {       x = x * 10 + ch -  0 ;       ch = getchar();     }     return x;   }   void calc(int i, int j) {     if (dp[i - 1][j] == -1) {       g[i][j] = -1;       return;     }     if (!b[i].id[j])       g[i][j] = dp[i - 1][j] + b[i].d - b[i - 1].d;     else if (dp[i - 1][j] + b[i].d - b[i - 1].d <= t)       g[i][j] = -1;     else       g[i][j] = dp[i - 1][j] + b[i].d - b[i - 1].d - t;   }   void upd(int i, int j) {     dp[i][j] = g[i][j];     if (!b[i].id[j]) dp[i][j] = max(dp[i][j], min(g[i][j ^ 1], t));   }   int main() {     int i, j, k, nw, x, len[2], p[2], tmp, st;     scanf( %d%d%d%d , &n, &m[0], &m[1], &t);     if (m[0] + m[1] == 0) {       printf( Yes n0 n n0 n n );       return 0;     }     for (i = 0; i <= 1; i++) {       len[i] = 0;       for (j = 1; j <= m[i]; j++) {         x = read();         if (a[len[i]][i].d == x)           a[len[i]][i].id = 1;         else           a[++len[i]][i] = (nd){x, 1};         a[++len[i]][i] = (nd){x + 1, 0};       }       a[len[i] + 1][i] = (nd){inf, 0};     }     tot = 0;     memset(b, 0, sizeof(b));     for (p[0] = p[1] = 1; ((p[0] <= len[0]) || (p[1] <= len[1]));) {       if (a[p[0]][0].d <= a[p[1]][1].d)         nw = 0;       else         nw = 1;       if (b[tot].d != a[p[nw]][nw].d) b[++tot].d = a[p[nw]][nw].d;       b[tot].id[nw] = a[p[nw]][nw].id;       p[nw]++;     }     dp[0][0] = dp[0][1] = 0;     for (i = 1; i <= tot; i++) {       for (j = 0; j <= 1; j++) calc(i, j);       for (j = 0; j <= 1; j++) upd(i, j);     }     if ((dp[tot][0] == -1) && (dp[tot][1] == -1))       printf( No n );     else {       printf( Yes n );       if (g[tot][0] != -1)         path[tot] = 0;       else         path[tot] = 1;       for (i = tot - 1; i; i--)         if ((g[i][path[i + 1]] != -1) &&             (b[i + 1].d - b[i].d + g[i][path[i + 1]] -                  b[i + 1].id[path[i + 1]] * t ==              g[i + 1][path[i + 1]]))           path[i] = path[i + 1];         else           path[i] = path[i + 1] ^ 1;       ans[0] = 0;       for (i = 1; i <= tot; i++)         if (path[i - 1] ^ path[i]) ans[++ans[0]] = b[i - 1].d;       printf( %d n , ans[0]);       for (i = 1; i <= ans[0]; i++) printf( %d  , ans[i]);       printf(  n );       ans[0] = 0;       for (i = 1; i <= tot; i = j + 1) {         j = i;         while ((j <= tot) && (path[j + 1] == path[i])) j++;         tmp = 0;         for (k = i; k <= j; k++) tmp += b[k].id[path[i]];         st = b[i - 1].d + t - dp[i - 1][path[i]];         for (k = 1; k <= tmp; k++, st += t)           po[++ans[0]] = (point){st, path[i] + 1};       }       printf( %d n , ans[0]);       for (i = 1; i <= ans[0]; i++) printf( %d %d n , po[i].x, po[i].y);     }     return 0;   }   