• 少女NULL中


    NULL

    inline void read (int &now)
    {
        register char word = getchar (); int temp = 0;
        for (now = 0; !isdigit (word); word = getchar ()) if (word == '-') temp = 1;
        for (; isdigit (word); now = now * 10 + word - '0', word = getchar ());
        if (temp) now = -now;
    }
    int BUF = 1000010;
    char Buf[1000010], *buf = Buf;
    
    void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    #include <cstdio>
    #include <iostream>
    
    #define INF 1e9
    
    inline void read (int &now)
    {
        register char c = getchar (); int temp = 0;
        for (now = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); now = now * 10 + c - '0', c = getchar ());
    }
    
    using namespace std;
    #define Max 2020
    
    int N, M, V, E;
    
    double map[Max][Max];
    int room[Max], other[Max];
    double k[Max];
    double dp[Max][Max][2];
    
    int Main ()
    {
        freopen ("classroom.in", "r", stdin);
        freopen ("classroom.ans", "w", stdout);
        read (N), read (M), read (V), read (E);
    
        register int i, j;
        
        for (i = 1; i <= N; ++ i)
            read (room[i]);
        for (i = 1; i <= N; ++ i)
            read (other[i]);
        for (i = 1; i <= N; ++ i)
            scanf ("%lf", &k[i]);
    
        int x, y, z;
    
        for (i = 1; i <= V; ++ i)
            for (j = 1; j <= V; ++ j)
                if (i == j)    map[i][i] = 0;
                else map[i][j] = INF;
    
        for (i = 1; i <= E; ++ i)
        {
            read (x), read (y), read (z);
            if (x == y) continue;
            map[x][y] = min (map[x][y], (double)z);
            map[y][x] = map[x][y];
        }
    
        int pos;
        for (pos = 1; pos <= V; ++ pos)
            for (i = 1; i <= V; ++ i)
                for (j = 1; j <= V; ++ j)
                    map[i][j] = min (map[i][j], map[i][pos] + map[pos][j]);
    
        int L; double res;
        for (i = 0; i <= N; ++ i)
            for (j = 0; j <= M; ++ j)
                dp[i][j][0] = dp[i][j][1] = INF;
        dp[1][0][0] = 0, dp[1][1][1] = 0;
    
        for (i = 2; i <= N; ++ i)
        {    
            dp[i][0][0] = dp[i - 1][0][0] + map[room[i - 1]][room[i]];
            for (j = 1, L = min (M, i); j <= L; ++ j)
            {
                dp[i][j][0] = min (dp[i - 1][j][0] + map[room[i - 1]][room[i]], dp[i - 1][j][1] + map[room[i - 1]][room[i]] * (1.0 - k[i - 1]) + map[other[i - 1]][room[i]] * k[i - 1]);
                dp[i][j][1] = dp[i - 1][j - 1][0] + map[room[i - 1]][room[i]] * (1.0 - k[i]) + map[room[i - 1]][other[i]] * k[i];
                res = dp[i - 1][j - 1][1] + map[room[i - 1]][room[i]] * (1.0 - k[i - 1]) * (1.0 - k[i]);
                res += map[other[i - 1]][room[i]] * k[i - 1] * (1.0 - k[i]);
                res += map[room[i - 1]][other[i]] * (1.0 - k[i - 1]) * k[i];
                res += map[other[i - 1]][other[i]] * k[i - 1] * k[i];
                dp[i][j][1] = min (dp[i][j][1], res);
            }
        }
    
        double Answer = INF;
        for (i = 0; i <= M; ++ i)
            Answer = min (Answer, min (dp[N][i][0], dp[N][i][1]));
        printf ("%.2lf", Answer);
        
        fclose (stdin);
        fclose (stdout);    
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <iostream>
    #include <cstdio>
    
    const int BUF = 10000022;
    char Buf[BUF], *buf = Buf;
    
    void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define Max 2010
    
    int C[Max + 2][Max + 2];
    int sum[Max + 2][Max + 2];
    
    inline int min (int a, int b)
    {
        return a < b ? a : b;
    }
    int data[Max + 2];
    
    int Main ()
    {
        freopen ("problem.in", "r", stdin);
        freopen ("problem.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
        int N, M, K;
        int T;
        read (T), read (K);
        C[0][0] = 1;
        register int i, j;
        int S = 0;
        
        for (i = 1; i <= Max; ++ i)
        {
            C[i][0] = 1;
            for (j = 1; j <= i; j ++)
            {
                C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % K;
                if (C[i][j] == 0) ++ data[i];
                if (i == j) sum[i][j] = sum[i - 1][j - 1] + data[i];
                else sum[i][j] = sum[i - 1][j] + data[i];
            }
        }
    
        int x, y;
        for (i = 1; i <= T; ++ i)
        {
            read (x), read (y);
            printf ("%d
    ", sum[x][min (y, x)]);
        }
     
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    
    const int BUF = 10102030;
    char Buf[BUF], *buf = Buf;
    
    #define Inline __attri
    bute__( ( optimize ( "-O2" ) ) )
    
    Inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    std :: priority_queue <int> Heap;
    int Tag;
    
    Inline void write (int x)
    {
        if (x > 9) write (x / 10);
        putchar (x % 10 + '0');
    }
    
    Inline int Main ()
    {
        freopen ("earthworm.in", "r", stdin);
        freopen ("earthworm.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
        int N, M, Q, U, V, T;
        read (N), read (M), read (Q), read (U), read (V), read (T);    
    
        register int i;
        int x;    
        double k = (double)U / V;
        for (i = 1; i <= N; ++ i)
        {
            read (x);
            Heap.push (x);
        }
        register int pos;    
        for (i = 1; i <= M; ++ i)
        {
            pos = Heap.top () + Tag, Heap.pop ();
              if (i % T == 0) write (pos), putchar (' ');
            x = (int)(k * pos), Heap.push (x - Tag - Q), Heap.push (pos - x - Tag - Q);
            Tag += Q;
        }
        putchar ('
    ');
        for (i = 1; i <= N + M; ++ i)
        {
            if (i % T == 0) write (Heap.top () + Tag), putchar (' ');
            Heap.pop ();
        }    
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    
    #define Max 100010
    
    const int BUF = 10000010;
    char Buf[BUF], *buf = Buf;
    
    void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    int data[Max];
    
    struct Queue
    {
        protected : 
        
            int H, T, c[Max * 80];
        
        public :
            Queue () { H = 1; T = 0; }
            inline void push (int key) { c[++ T] = key;}
            inline void pop () { ++ H; }
            inline int front () { return c[H]; }
            inline bool empty () { return H > T; }
    };
    
    Queue queue[3];
    
    int Get_Max ()
    { 
        int now;
        for (int i = 0; i <= 2; ++ i)
        {
            if (queue[i].empty ()) continue;
            if (i != 0 && !queue[0].empty () && queue[0].front () > queue[i].front ()) continue;
            if (i != 1 && !queue[1].empty () && queue[1].front () > queue[i].front ()) continue;
            if (i != 2 && !queue[2].empty () && queue[2].front () > queue[i].front ()) continue;
            now = queue[i].front (), queue[i].pop ();
            return now;
        }
    }
    
    
    int Main ()
    {
        freopen ("earthworm.in", "r", stdin);
        freopen ("earthworm.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
        int N, M, Q, U, V, T;
           register int i, pos, Tag = 0;
           read (N), read (M), read (Q), read (U), read (V), read (T); 
        for (i = 1; i <= N; ++ i)    
            read (data[i]);
        std :: sort (data + 1, data + N + 1);
        for (i = N; i >= 1; -- i) 
            queue[0].push (data[i]);
        for (i = 1; i <= M; ++ i)
        {
            pos = Get_Max ();
            if (i % T == 0)
                printf ("%d ", pos + Tag);
            queue[1].push ((long long)(pos + Tag) * U / V - Tag - Q);
            queue[2].push ((pos + Tag) - (long long)(pos + Tag) * U / V - Tag - Q);
            Tag += Q;
        }
           putchar ('
    ');
        for (i = 1; !queue[0].empty () || !queue[1].empty () || !queue[2].empty(); ++ i)
        {  
            pos = Get_Max ();
            if (i % T == 0)
                printf ("%d ", pos + Tag);
        }
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    
    #define Max 25
    #define EPS 1e-8
    
    inline void read (int &now)
    {
        register char c = getchar ();
        for (now = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); now = now * 10 + c - '0', c = getchar ());
    }
    int T, N, M, Answer;
    
    struct Point
    { 
        double x, y; 
    };  
    
    struct Line
    {    
        double a, b, x, y; 
    };
    
    Point p[Max];
    Line b[Max];
    int use[Max];
    bool visit[Max];
    
    
    inline double Cal (int pos, int z)  
    {  
        return fabs (b[pos].a * p[z].x * p[z].x + b[pos].b * p[z].x - p[z].y);  
    }  
    
    void Dfs (int n, int res)  
    {  
        if (n > N)  
        {  
            if (res < Answer) Answer = res;  
            return;  
        }  
        if (res >= Answer) return;  
        for (int i = 1; i <= res; ++ i)   
            if (use[i] <= 1)  
            {  
                double X1 = b[i].x, Y1 = b[i].y, X2 = p[n].x, Y2 = p[n].y;  
                double d = X1 / X2;
                if (fabs (X1 * X2 - X1 * X1) <= EPS) 
                    continue;  
                b[i].a = (Y2 * d - Y1) / (X1 * X2 - X1 * X1);  
                b[i].b = (Y1 - b[i].a * X1 * X1) / X1;  
                if (b[i].a >= -EPS) 
                    continue;  
                ++ use[i], Dfs (n + 1,res), -- use[i];  
            }  
            else if (Cal (i, n) <= EPS) 
                Dfs (n + 1, res);  
        
        b[res + 1].x = p[n].x, b[res + 1].y = p[n].y;  
        use[res + 1] = 1, Dfs (n + 1, res + 1), use[res + 1] = 0;  
    }  
    
    
    int Main ()  
    {  
        freopen ("angrybirds.in", "r", stdin);  
        freopen ("angrybirds.ans", "w", stdout);  
        read (T);
        for (; T; -- T)
        {  
            read (N), read (M);
            Answer = 25;  
            memset (p, 0, sizeof p);  
            memset (b, 0, sizeof b);  
            memset (use, 0, sizeof use);  
            for (int i = 1; i <= N; ++ i)  
                scanf ("%lf%lf", &p[i].x, &p[i].y);  
            Dfs (1, 0);  
            printf ("%d
    ", Answer);  
        }  
        return 0;  
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    
    #define Max 50
    int map[Max][Max];
    
    int Main ()
    {
        freopen ("magic.in", "r", stdin);
        freopen ("magic.ans", "w", stdout);
    
        int N, j; 
        scanf ("%d", &N);    
        register int i, x = 1, y = ((N >> 1) + 1); int L = N * N;        
        map[x][y] = 1;
        for (i = 2; i <= L; ++ i)
        {
            if (x == 1 && y != N) x = N, ++ y;
            else if (y == N && x != 1) -- x, y = 1;
            else if (x == 1 && y == N) ++ x;
            else if (x != 1 && y != N)
            {
                if (map[x - 1][y + 1] == 0) -- x, ++ y;
                else ++ x;
            }
            map[x][y] = i;
        }
        for (i = 1; i <= N; ++ i)
        {
            for (j = 1; j <= N; ++ j)
                printf ("%d ", map[i][j]);
            putchar ('
    ');
        }    
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    #include <stack>
    
    const int BUF = 10001023;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    #define Max 300000
    int N, Answer = 1e9;
    
    inline int min (int a, int b)
    {
        return a < b ? a : b;
    }
    
    class Tarjan_Type
    {
        private : 
    
            int to[Max], _next[Max], C, list[Max];
            int scc_number[Max], Scc_C, dfn[Max], low[Max], D_C;
            std :: stack <int> Stack;
    
        public :
            
            Tarjan_Type ()
            {
                C = 0, Scc_C = 0, D_C = 0;
            }
            inline void In (int u, int v)
            {
                to[++ C] = v, _next[C] = list[u], list[u] = C;
            }
    
            void Do_Tarjan ()
            {
                for (int  i = 1; i <= N; ++ i)
                    if (!dfn[i]) Dfs (i);
            }
    
            void Dfs (int now)
            {
                dfn[now] = low[now] = ++ D_C, Stack.push (now);
                for (int i = list[now]; i; i = _next[i])
                {
                    if (!dfn[to[i]])
                    {
                        Dfs (to[i]);
                        low[now] = min (low[to[i]], low[now]);
                    }
                    else if (!scc_number[to[i]])
                        low[now] = min (dfn[to[i]], low[now]);
                }
                if (dfn[now] == low[now])
                {
                    ++ Scc_C; int pos = now + 1, res = 0;
                    for (; pos != now && !Stack.empty (); Stack.pop ())
                        pos = Stack.top (), scc_number[pos] = Scc_C, ++ res;
                    if (res != 1) Answer = min (Answer, res);
                }
    
            }
    };
    
    Tarjan_Type Tar;
    
    int Main ()
    {
        freopen ("message.in", "r", stdin);
        freopen ("message.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
    
        read (N);
        int x;    
        for (int i = 1; i <= N; ++ i)
            read (x), Tar.In (i, x);
        Tar.Do_Tarjan ();
    
        printf ("%d", Answer);
    
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    #define INF 1e7
    
    const int BUF = 1000100;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define Max 30
    
    int T, N, Answer ;
    int card[Max], count[Max];
    
    inline int min (int a, int b)
    {
        return a < b ? a : b;
    }
    
    void Dfs (int now)
    {
        if (now > Answer) return;
        int res = 0; register int i, j;
        
        for (i = 0; i < 30; i ++) count[i] = 0;
        for (i = 0; i <= 14; i++) count[card[i]]++;
        
        for (; count[4]; )
        {
            -- count[4], ++ res;
            if (count[2] >= 2) count[2] -= 2;
            else if (count[1] >= 2) count[1] -= 2;
        }
        for (; count[3]; )  
        {
            -- count[3], ++ res;
            if (count[2])  -- count[2];
            else if (count[1]) -- count[1];
        }
        
        if (card[0] && card[1] && count[1] >= 2) -- res;
        res += count[1] + count[2], Answer = min (res + now, Answer);
        
        for (i = 3, j; i <= 14; ++i)
        {
            for (j = i; card[j] && j <= 14; ++j)  
            {
                -- card[j];
                if (j - i + 1 >= 5) Dfs (now + 1);
            }
            for (; j > i; ) ++ card [--j];
        }
    
        for (i = 3, j; i <= 15; ++i)
        {
            for (j = i; card[j] >= 2 && j <= 14; ++j)
            {
                card[j] -= 2;
                if (j - i + 1 >= 3) Dfs (now + 1);
            }
            for (; j > i; ) card [--j] += 2;
        }
    
        for (i = 3, j; i <= 15; ++i) 
        {
            for (j = i; card[j] >= 3 && j <= 14; ++j)
            {
                card[j] -= 3;
                if (j - i + 1 >= 2) Dfs (now + 1);
            }
            for (; j > i; ) card [--j] += 3;
        }
    }
    int Main ()
    {
        freopen ("landlords.in", "r", stdin);
        freopen ("landlords.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
        read (T), read (N);
        int x, y; register int i;
        for (; T; -- T)
        {
            memset (card, 0, sizeof (card));
            Answer = INF;
            
            for (i = 1; i <= N; ++ i)
            {
                read (x), read (y);
                if (x == 0) ++ card [y - 1];
                else if (x == 1) ++ card [14];    
                else ++ card[x];
            }
            
            Dfs (0);
            
            printf ("%d
    ", Answer);
        }
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    
    const int BUF = 10000012;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define Max 60000
    int N, L, M;
    int key[Max];
    
    bool Check (int Thb)
    {
        int res = 0, C = 0, last = 0;
        for (int i = 1; i <= N; ++ i)
        {
            if (key[i] - last < Thb)
                ++ C;
            else last = key[i];
            if (C > M) return false;
        }
        return true;
    }
    
    int Main ()
    {
        freopen ("stone.in", "r", stdin);
        freopen ("stone.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
    
        read (L), read (N), read (M);    
        
        int l = 0, r = L, Mid;
        
        for (int i = 1; i <= N; ++ i) read (key[i]);
        int Answer;    
        for (; l <= r; )
        {
            Mid = l + r >> 1;
            if (Check (Mid))
            {
                Answer = Mid;
                l = Mid + 1;
            }
            else r = Mid - 1;
        }
    
        printf ("%d", Answer);
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    
    #define Max 1030
    
    void read (int &now)
    {
        register char c = getchar ();
        for (now = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); now = now * 10 + c - '0',  c = getchar ());
    }
    
    #define Mod 1000000007
    int N, M, K;
    char A[Max], B[Max];
    int dp[Max][Max][Max / 10 * 2];
    int pos = 1, next;
    
    int data[Max][Max][Max / 10 * 2];
     
    int Main ()
    {
        freopen ("substring.in", "r", stdin);
        freopen ("substring.ans", "w", stdout);
        dp[0][0][0] = 1;
        read (N), read (M), read (K);
        scanf ("%s%s", A + 1, B + 1);    
        register int i, j, k;
        int Answer;
        for (i = 1; i <= N; ++ i)
        {
            dp[pos][0][0] = 1;
            for (j = 1; j <= M; ++ j)
                for (k = 1; k <= K; ++ k)
                {
                    if (A[i] != B[j])
                        data[pos][j][k] = 0;
                    else data[pos][j][k] = (data[next][j - 1][k] + dp[next][j - 1][k - 1]) % Mod;
                    dp[pos][j][k] = (dp[next][j][k] + data[pos][j][k]) % Mod;
                }
            k = pos, pos = next, next = k;
            Answer = next;
        }
        
        printf ("%d", dp[Answer][M][K]);
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    
    #define Inline __attri
    bute__( ( optimize ( "-O2" ) ) )
    
    const int BUF = 234234234;
    char Buf[BUF], *buf = Buf;
    #define INF 1e9
    
    Inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define Max 300050
    
    int N, M;
    int t_n[Max];
    
    Inline void swap (int &x, int &y)
    {
        int now = x; x = y, y = now;
    }
    
    struct Bit_Tree
    {
        protected : int sum[Max];
                    int N;
        public :
    
            Inline void Prepare (const int &x) 
            {
                this->N = x;
                for (register int i = 1; i <= N; ++ i)
                    sum[i] = 0;
            }
    
            Inline int Ask (int l, int r)
            {
                int res = 0;
                for (-- l; l; l -= l & (-l)) res -= sum[l];
                   for (; r; r -= r & (-r)) res += sum[r];
                return res;    
            }
            
            Inline void Change (int pos, int to)
            {
                for (; pos <= N; pos += pos & (-pos))
                    sum[pos] += to;
            }
    };
    Bit_Tree Bit;
    
    inline int min (int a, int b)
    {
        return a < b ? a : b;
    }
    
    inline int max (int a, int b)
    {
        return a > b ? a : b;
    }
    
    class Tree_Chain_Get
    {
        private : 
    
            int to[Max << 1], _next[Max << 1], dis[Max << 1], C, list[Max];
            int deep[Max], size[Max], father[Max], chain[Max], son[Max];
    
            int value[Max], key[Max], Count;
        public :
    
            Inline void In (const int &M)
            {
                int x, y, z;
                for (register int i = 1; i <= M; ++ i)
                {
                    read (x), read (y), read (z);
                    to[++ C] = y, _next[C] = list[x], list[x] = C, value[C] = z;
                    to[++ C] = x, _next[C] = list[y], list[y] = C, value[C] = z;
                }
                Bit.Prepare (M + 1);
                Dfs_1 (1, 0), Count = 0, Dfs_2 (1, 1);
            }
    
            void Dfs_1 (int now, int Father)
            {
                father[now] = Father, size[now] = 1, deep[now] = deep[Father] + 1;
                for (int i = list[now]; i; i = _next[i])
                    if (to[i] != Father)
                    {
                        Dfs_1 (to[i], now);
                        size[now] += size[to[i]];
                        if (size[son[now]] < size[to[i]])
                            son[now] = to[i];
                    }
            }
    
            void Dfs_2 (int now, int point)
            {
                chain[now] = point;
                for (int i = list[now]; i; i = _next[i])
                    if (to[i] == father[now])
                    {
                        key[now] = value[i];
                        break;
                    }
                   t_n[now] = ++ Count; Bit.Change (Count, key[now]);    
                if (son[now]) Dfs_2 (son[now], point);
                else return ;
                for (int i = list[now]; i; i = _next[i])
                    if (to[i] != son[now] && to[i] != father[now])
                        Dfs_2 (to[i], to[i]);
            }
        
            Inline int Q (int x, int y)
            {
                int res = 0;
                for (; chain[x] != chain[y]; )
                {
                    if (deep[chain[x]] < deep[chain[y]]) swap (x, y);    
                    res += Bit.Ask (t_n[chain[x]], t_n[x]);
                    x = father[chain[x]];
                }
                if (deep[x] > deep[y]) swap (x, y);
                if (x != y) res += Bit.Ask (t_n[x] + 1, t_n[y]);
                return res;
            }    
    };
    
    Tree_Chain_Get T;
    int q_x[Max], q_y[Max];
    
    Inline int Main ()
    {
        freopen ("transport.in", "r", stdin);
        freopen ("transport.ans", "w", stdout);
    
        fread (buf, 1, BUF, stdin);
        read (N), read (M);
        T.In (N - 1);
        int x, y; register int i, j;    
        for (i = 1; i <= M; ++ i)
            read (q_x[i]), read (q_y[i]);
        int Answer = INF, now, res, pos;    
    
        for (i = 2; i <= N; ++ i)
        {
            pos = t_n[i];
            now = Bit.Ask (pos, pos); res = -1;
            Bit.Change (pos, -now);        
            for (j = 1; j <= M; ++ j)
                res = max (res, T.Q (q_x[j], q_y[j]));
            Answer = min (Answer, res);    
            Bit.Change (pos, now);
        }
        printf ("%d", Answer);
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    
    const int BUF = 12312312;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define Max 300
    int c[Max], d[Max];
    int map[5][5];
    
    int Main ()
    {
        freopen ("rps.in", "r", stdin);
        freopen ("rps.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
        int N, A, B;
        read (N), read (A), read (B);
        register int i, j, k;
        for (i = 1; i <= A; ++ i)
            read (c[i]);
        for (i = 1; i <= B; ++ i)
            read (d[i]);
        memset (map, - 1, sizeof map);
        for (i = 0; i < 5; ++ i) map[i][i] = 0;
        map[0][1] = 2, map[0][4] = 2, map[1][2] = 2, map[1][4] = 2;
        map[0][2] = 1, map[0][3] = 1, map[2][3] = 2;
        map[1][3] = 1, map[2][4] = 1, map[3][4] = 1;
        int Z = 0, X = 0;    
        for (i = 1, j = 1, k = 1; i <= N; ++ i, ++ j, ++ k)
        {
            if (j == A + 1) j = 1;
            if (k == B + 1) k = 1;    
            if (map[c[j]][d[k]] == -1)
            {
                if (map[d[k]][c[j]] == 1) ++ X;
                else if (map[d[k]][c[j]] == 2) ++ Z;
                continue;    
            }
            if (map[c[j]][d[k]] == 1) ++ Z;
            else if (map[c[j]][d[k]] == 2) ++ X;
        }
        printf ("%d %d", Z, X);    
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    
    
    const int BUF = 12312312;
    char Buf[BUF], *buf = Buf;
    
    void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define Max 200200
    
    struct E
    {
        E *n;
        int to;
    };
    E poor[Max << 1], *Tail = poor, *list[Max];
    int key[Max];
    #define Mod 10007
    
    inline void In (int u, int v)
    {
        ++ Tail, Tail->to = v, Tail->n = list[u], list[u] = Tail;
        ++ Tail, Tail->to = u, Tail->n = list[v], list[v] = Tail;
    }
    
    int N, father[Max];
    int T, Answer = -1;
    
    inline int max (int a, int b)
    {
        return a > b ? a : b;
    }
    
    void Dfs (int now, int Father)
    {
        father[now] = Father; int Grand = father[Father], res;
        if ((res = key[now] * key[Grand]) != 0)
        {    
            Answer = max (Answer, res);    
            T = (T + ((res % Mod) << 1));
        }
        for (E *e = list[Father]; e; e = e->n)
            if (e->to != now && e->to != Grand)
            {
                res = key[e->to] * key[now];
                Answer = max (Answer, res);
                T = (T + res) % Mod;
            }
        for (E *e = list[now]; e; e = e->n)
            if (e->to != Father)
                Dfs (e->to, now);
    }    
                    
    int Main ()
    {
        freopen ("link.in", "r", stdin);
        freopen ("link.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
        read (N); int x, y;
        for (int i = 1; i < N; ++ i)
        {
            read (x), read (y);
            In (x, y);
        }
    
        for (int i = 1; i <= N; ++ i)
            read (key[i]);
    
        Dfs (1, 0);
        printf ("%d %d", Answer, T);
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    
    const int BUF = 12312312;
    char Buf[BUF], *buf = Buf;
    
    #define INF 1e8
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    #define Max 100030
    
    int up[Max], down[Max], N, M, K;
    int u[Max], d[Max], Answer = INF, Z;
    
    inline int min (int a, int b)
    {
        return a < b ? a : b;
    }
    bool flag = false;
    void Dfs (int x, int h, int c)
    {
        if (c > Answer) return ;
        if (x > Z) Z = x;
        if (x == N)
        {
            flag = true;
            Answer = min (Answer, c);
            return ;
        }
        if (u[x + 1] == 0)
            for (int i = 1; h + i * up[x] > d[x + 1]; ++ i)
            {
                if (h + i * up[x] >= M)
                {
                    Dfs (x + 1, M, c + i);
                    break;
                }
                else
                    Dfs (x + 1, h + i * up[x], c + i);
            }
        else
            for (int i = 1; (h + i * up[x]) > d[x + 1] && (h + i * up[x] < u[x + 1]); ++ i)
                Dfs (x + 1, h + i * up[x], c + i);
        if (h - down[x] > d[x + 1] && h - down[x] < (u[x + 1] == 0 ? INF : u[x + 1])) 
            Dfs (x + 1, h - down[x], c); 
    }
    
    int Main ()
    {
        freopen ("bird.in", "r", stdin);
        freopen ("bird.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
        register int i;
        read (N), read (M), read (K);
    
        for (i = 0; i < N; ++ i)
            read (up[i]), read (down[i]);
        int x;    
        for (i = 1; i <= K; ++ i)
            read (x), read (d[x]), read (u[x]);    
        for (i = 1; i <= M; ++ i)
            Dfs (0, i, 0);
        if (flag) printf ("1
    %d", Answer);
        else 
        {
            int res = 0;
            for (i = 1; i <= Z; ++ i)
                if (u[i]) ++ res;
            printf ("0
    %d", res);
        }
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    
    const int BUF = 12312313;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define Max 130
    int map[Max][Max];
    const int N = Max - 1;
    
    inline int max (int a, int b)
    {
        return a > b ? a : b;
    }
    inline int min (int a, int b)
    {
        return a < b ? a : b;
    }
    int Main ()
    {
        freopen ("wireless.in", "r", stdin);
        freopen ("wireless.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
    
        int D, K; read (D), read (K);
        register int i, j; int x, y, z;
        for (i = 1; i <= K; ++ i)
        {
            read (x), read (y), read (z);
            map[x][y] = z;
        }
        int Answer = -1, C = 0, res;
        for (x = 0; x < N; ++ x)
            for (y = 0; y < N; ++ y)
            {
                res = 0;
                for (i = -D; i <= D; ++ i)
                    for (j = -D; j <= D; ++ j)
                        res += map[min (N - 1, max (0, x - i))][min (N - 1, max (0, y - j))];
                if (res == Answer) ++ C;
                if (res > Answer) Answer = res, C = 1;
            }
    
        printf ("%d %d", C, Answer);
                    
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    #include <queue>
    #include <cstring>
    #include <cstdlib>
    
    #define Max 220200
    
    const int BUF = 123123123;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    struct E
    {
        E *n;
        int to;
    };
    E *list[Max], poor[Max << 1], *Tail = poor;
    bool visit[Max];
    
    void F_Bfs (const int &S, const int &T)
    {
        std :: queue <int> Queue; int now; visit[S] = true;
        for (Queue.push (S); !Queue.empty (); Queue.pop ())
        {
            now = Queue.front ();
            for (E *e = list[now]; e; e = e->n)
                if (!visit[e->to])
                {
                    visit[e->to] = true;
                    Queue.push (e->to);
                }
        }
    }
    int dis[Max];
    void Z_Bfs (const int &S, const int &T)
    {
        memset (dis, -1, sizeof dis); E *e;
        std :: queue <int> Queue; int now; dis[S] = 0;
        for (Queue.push (S); !Queue.empty (); Queue.pop ())
        {
            now = Queue.front ();
            for (e = list[now]; e; e = e->n)
                if (!visit[e->to]) goto Continue;    
            for (e = list[now]; e; e = e->n)
                if (dis[e->to] == -1)
                {
                    dis[e->to] = dis[now] + 1;
                    Queue.push (e->to);
                    if (e->to == T)
                    {
                        printf ("%d", dis[T]);
                        exit (0);
                    }
                }
            Continue : continue;
        }
    }
    int da_x[Max], da_y[Max];
    
    int Main ()
    {
        freopen ("road.in", "r", stdin);
        freopen ("road.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
        int N, M, x, y, z, S, T; read (N), read (M); register int i;    
        for (i = 1; i <= M; ++ i)
        {
            read (da_x[i]), read (da_y[i]);
            ++ Tail, Tail->to = da_x[i], Tail->n = list[da_y[i]], list[da_y[i]] = Tail;
        }
        read (S), read (T);
        F_Bfs (T, S);
        for (i = 1; i <= M; ++ i) list[i] = NULL;    
        for (i = 1, Tail = poor; i <= M; ++ i)
            ++ Tail, Tail->to = da_y[i], Tail->n = list[da_x[i]], list[da_x[i]] = Tail;
        Z_Bfs (S, T);
        printf ("-1");
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    
    const int BUF = 12312312;
    char Buf[BUF], *buf = Buf;
    
    void read (int &now)
    {
        int temp = 0;
        for (now = 0; !isdigit (*buf); ++ buf)
            if (*buf == '-') temp = 1;
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
        if (temp) now = -now;
    }
    #define Max 100
    int a[Max];
    long long F_P (int x, int p)
    {
        if (p == 0) return 1;
        long long res = 1;
        for (; p; p >>= 1)
        {
            if (p & 1) res *= x;
            x *= x;
        }
        return res;
    }
    
    int Main ()
    {
        freopen ("equation.in", "r", stdin);
        freopen ("equation.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
        int N, M; register int i;
        read (N), read (M);
        
        for (i = 0; i <= N; ++ i)
            read (a[i]);
        register int j; int C = 0; long long res;
        static int Answer[Max];
        for (i = 1; i <= M; ++ i)
        {
            res = 0;
            for (j = 0; j <= N; ++ j)
                res += a[j] * F_P (i, j);
            if (!res) Answer[++ C] = i;
        }
    
        printf ("%d
    ", C);
        for (i = 1; i <= C; ++ i)
            printf ("%d
    ", Answer[i]);
        
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    
    const int BUF = 12312312;
    char Buf[BUF], *buf = Buf;
    
    inline void read (long long &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    
    long long Q_P (long long x, long long p, long long Mod)
    {
        long long res = 1;
        for (; p; p >>= 1)
        {
            if (p & 1) res = (res * x) % Mod;
            x = (x * x) % Mod;
        }
        return res;
    }
    
    void write (long long now)
    {
        if (now > 9) write (now / 10);
        putchar (now % 10 + '0');
    }
    
    int Main ()
    {
        freopen ("circle.in", "r", stdin);
        freopen ("circle.ans", "w", stdout);
    
        fread (buf, 1, BUF, stdin);
    
        long long N, M, K, X;
        read (N), read (M), read (K), read (X);
    
        write ((X + M * Q_P (10, K, N)) % N);
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    const int BUF = 123123123;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define INF 1e9
    #define Max 30100
    
    struct E
    {
        E *n;
        int to, key;
    };
    E *list[Max], poor[Max], *Tail = poor;
    
    struct Edge
    {
        int from, to, key;
        bool operator < (const Edge &now) const
        {
            return this->key > now.key;
        }
    };
    Edge data[Max * 5];
    
    struct Unio_Find
    {
        protected : int data[Max];
        public :
            
            void Prepare (const int &N)    
            {
                for (register int i = 1; i <= N; ++ i) 
                    data[i] = i;
            }
    
            int Find (int x) 
            {    
                return data[x] == x ? x : data[x] = Find (data[x]);
            }
    
            inline void Unio (int x, int y)    { data[x] = y; }
    };
    Unio_Find Ufs;
    inline int min (int a, int b)
    {
        return a < b ? a : b;
    }
    int N, M;
    struct S_D
    {
        S_D *Left, *Right;
        int key, Mid;
        inline void Up ()
        {
            this->key = min (this->Left->key, this->Right->key);
        }
    };
    int tree_key[Max], in[Max];
    
    inline void swap (int &a, int &b)
    {
        int now = a; a = b, b = now;
    }
    
    class Segment_Tree
    {
        private : S_D _poor[Max], *Tail, *Root;
        
            inline S_D *New (int x, int y)
            {
                ++ this->Tail, this->Tail->Mid = x + y >> 1, this->Tail->key = 0;
                this->Tail->Left = this->Tail->Right = NULL; return this->Tail;
            }    
    
            void Build (S_D *&now, int l, int r)
            {
                now = New (l, r);
                if (l == r)
                {
                    now->key = tree_key[l];
                    return ;
                }
                Build (now->Left, l, now->Mid);
                Build (now->Right, now->Mid + 1, r);
                now->Up ();
            }
    
            int Query (S_D *&now, int L, int R, int l, int r)
            {
                if (l <= L && R <= r)
                    return now->key;
                int res = INF;
                if (l <= now->Mid) res = Query (now->Left, L, now->Mid, l, r);
                if (r > now->Mid) 
                    res = min (res, Query (now->Right, now->Mid + 1, R, l, r));
                return res;
            }
                
        public :
            
            Segment_Tree () { this->Tail = _poor;}
    
            void Build (int l, int r) { return Build (Root, l, r); }
            int Query (int l, int r) { return Query (Root, 1, N, l, r); }
    };
    Segment_Tree Seg;
    
    class Tree_Chain_Get_Type
    {
        private : 
    
            int deep[Max], size[Max], father[Max], chain[Max], son[Max];
            int C;
        
            void Dfs_1 (int now, int Father)
            {
                size[now] = 1, father[now] = Father, deep[now] = deep[Father] + 1;
                for (E *e = list[now]; e; e = e->n)
                    if (e->to != Father)
                    {
                        Dfs_1 (e->to, now); size[now] += size[e->to];
                        if (size[son[now]] < size[e->to]) son[now] = e->to;
                    }
            }
    
            void Dfs_2 (int now, int point)
            {
                chain[now] = point; in[now] = ++ C; E *e;
                for (e = list[now]; e; e = e->n)
                    if (e->to == father[now])
                        tree_key[C] = e->key;
                if (son[now]) Dfs_2 (son[now], point);
                else return ;    
                for (e = list[now]; e; e = e->n)
                    if (e->to != son[now] && e->to != father[now])
                        Dfs_2 (e->to, e->to);
            }
        
        public :
            
            void Prepare ()
            {
                C = 0, Dfs_1 (1, 0), Dfs_2 (1, 1); Seg.Build (1, N);
                
            }
    
            int Query (int x, int y)
            {
                if (Ufs.Find (x) != Ufs.Find (y)) return -1;
                int res = INF;    
                for (; chain[x] != chain[y]; )
                {
                    if (deep[chain[x]] < deep[chain[y]]) swap (x, y);
                    res = min (Seg.Query (in[chain[x]], in[x]), res);    
                    x = father[chain[x]];
                }
                if (deep[x] > deep[y]) swap (x, y);
                if (x != y) res = min (res, Seg.Query (in[x] + 1, in[y]));
                return res;
            }
    };
    Tree_Chain_Get_Type T;
    
    int Main ()
    {
    
        freopen ("truck.in", "r", stdin);
        freopen ("truck.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
    
        read (N), read (M);
        int x, y, z;    
        register int i;
        for (i = 1; i <= M; ++ i)
        {
            read (x), read (y), read (z);
            data[i].from = x, data[i].to = y, data[i].key = z;
        }
        std :: sort (data + 1, data + 1 + M);
        int Count = 0; Ufs.Prepare (N);
        for (i = 1; i <= M; ++ i)
        {
            x = Ufs.Find (data[i].from), y = Ufs.Find (data[i].to);
            if (x != y)
            {
                ++ Tail, Tail->to = data[i].to, Tail->key = data[i].key;
                Tail->n = list[data[i].from], list[data[i].from] = Tail;
                ++ Tail, Tail->to = data[i].from, Tail->key = data[i].key;
                Tail->n = list[data[i].to], list[data[i].to] = Tail;
                ++ Count; Ufs.Unio (x, y);
            }
            if (Count == N - 1) break;
        }
        T.Prepare ();
        int Q; read (Q);
        for (i = 1; i <= Q; ++ i)
            read (x), read (y), printf ("%d
    ", T.Query (x, y));            
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    
    const int BUF = 12312313;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define Max 1221313
    int high[Max];
    
    int Main ()
    {
        freopen ("block.in", "r", stdin);
        freopen ("block.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
    
        int N, Answer = 0, Last = 0; read (N); register int i;
        for (i = 1; i <= N; ++ i)  read (high[i]);
        for (i = 1; i <= N; ++ i)
            if (high[i] >= Last)
            {
                Answer += high[i] - Last;
                Last = high[i];
            }
            else Last = high[i];
        printf ("%d", Answer);
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    
    const int BUF = 12312312;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define Max 120000
    
    int Main ()
    {
        freopen ("flower.in", "r", stdin);
        freopen ("flower.ans", "w", stdout);
    
        fread (buf, 1, BUF, stdin);
        int N, now, Answer = 0, res = 0, Last = 0; 
        read (N); register int i; read (Last);
        for (i = 2; i <= N; Last = now, ++ i)
        {
            read (now);
            if (res == 0 && now - Last) ++ Answer, res = now - Last;
            else if (now - Last != 0 && res > 0 && now < Last)
                ++ Answer, res = now - Last;
            else if (res < 0 && now > Last && now - Last)
                ++ Answer, res = now - Last;
        }
        printf ("%d", Answer + 1);
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    
    struct Data
    {
        int x, y, a, b;
        int step;
    }Make;
    
    #define Max 31
    
    const int BUF = 123123123;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    bool visit[Max][Max][Max][Max];
    int map[Max][Max];
    int N, M ,Q, Answer;
    int E_x, E_y, S_x, S_y, T_x, T_y;
    
    int move_x[5] = {0, 0, -1, 0, 1};
    int move_y[5] = {0, -1, 0, 1, 0};
    
    
    void Bfs ()
    {
        std :: queue <Data> Queue;
        Data now, pos; int a,b; register int k;
        memset (visit, false, sizeof visit);
        visit[S_x][S_y][E_x][E_y] = true;
        for (Queue.push (Make); !Queue.empty(); Queue.pop ())
        {
            now = Queue.front();
            if (now.a == T_x && now.b == T_y)
            {
                Answer=now.step;
                return ;
            }
            for (k = 1; k <= 4; ++ k)
            {
                pos = now;
                a = pos.x + move_x[k];
                b = pos.y + move_y[k];
                if (a == pos.a && b == pos.b)
                    pos.a = pos.x, pos.b = pos.y;
                if(!map[a][b] || a < 1 || a > N || b < 1 || b > M)
                    continue ;
                pos.x = a, pos.y = b, ++ pos.step;
                if (!visit[pos.a][pos.b][pos.x][pos.y])
                {
                    Queue.push (pos);
                    visit[pos.a][pos.b][pos.x][pos.y] = true;
                }
            }
        }
    }
    int Main ()
    {
        freopen ("puzzle.in", "r", stdin);
        freopen ("puzzle.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);
    
        read (N), read (M), read (Q); register int i, j;
        for (i = 1; i <= N; ++ i)
            for (j = 1; j <= M; ++ j)
                read (map[i][j]);
    
        for (; Q; -- Q)
        {
            Answer = N * M;
            read (E_x), read (E_y), read (S_x), read (S_y);
            read (T_x), read (T_y), Make.x = E_x, Make.y = E_y;
            Make.a = S_x, Make.b = S_y, Make.step = 0;
            if (S_x == T_x && S_y == T_y)
            {
                printf("0
    ");
                continue ;
            }
            Bfs ();
            if (Answer != N * M)
                printf ("%d
    ", Answer);
            else printf ("-1
    ");
        }
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    
    const int BUF = 12312312;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        bool temp = false;
        for (now = 0; !isdigit (*buf); ++ buf)
            if (*buf == '-')  temp = true;
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
        if (temp) now = -now;
    }
    
    #define Max 100050
    double _x[Max], _y[Max];
    double i2[Max], _i[Max];
    
    struct S_D 
    {
        S_D *Left, *Right;
        double x, x2, y, xy, ss, st, ts, tt;
        int l, r, Mid;
        bool tag;
        
        S_D (int _l, int _r)
        {
            x = x2 = ss = st = ts = tt = y = xy = 0;
            Left = Right = NULL;
            l = _l, r = _r, Mid = l + r >> 1;
            tag = false;
        }
    
        inline void Up ()
        {
            x = Left->x + Right->x, xy = Left->xy + Right->xy;
            y = Left->y + Right->y;
            x2 = Left->x2 + Right->x2;
        }
    
        inline void Down ()
        {
            S_D *L = Left, *R = Right;
        
            double ls = L->r - L->l + 1, rs = R->r - R->l + 1;
            if (tag)
            {
                L->x = ts * ls + _i[L->r] - _i[L->l - 1];
                   L->y = tt * ls + _i[L->r] - _i[L->l - 1];    
                L->xy = ts * tt * ls + (_i[L->r] - _i[L->l - 1]) * (ts + tt) + i2[L->r] - i2[L->l - 1];
                L->x2 = ts * ts * ls + (_i[L->r] - _i[L->l - 1]) * ts * 2.0 + i2[L->r] - i2[L->l - 1];
                
                
                R->x = ts * rs + _i[R->r] - _i[R->l - 1];
                R->y = tt * rs + _i[R->r] - _i[R->l - 1];
                R->xy = ts * tt * rs + (_i[R->r] - _i[R->l - 1]) * (ts + tt) + i2[R->r] - i2[R->l - 1];
                R->x2 = ts * ts * rs + (_i[R->r] - _i[R->l - 1]) * ts * 2.0 + i2[R->r] - i2[R->l - 1];
                L->ts = R->ts = ts, L->tt = R->tt = tt;
                L->ss = R->st = L->st = R->ss = 0;
                tt = ts = 0, tag = false;
                L->tag = R->tag = true;
            }
            if (ss || st)
            {
                L->xy += st * L->x + ss * L->y + ss * st * ls;
                L->x2 += ss * L->x + ss * L->x + ss * ss * ls;
                R->xy += st * R->x + ss * R->y + ss * st * rs;
                R->x2 += ss * R->x + ss * R->x + ss * ss * rs;
                L->x += ss * ls, R->x += ss * rs;
                L->y += st * ls, L->y += st * rs;
                L->ss += ss, R->ss += ss;
                L->st += st, R->st += st;
                ss = st = 0;
            }
        }
    };
    
    struct D
    {
        double x, y, x2, xy;
        D () : x (0), y (0), x2 (0), xy (0) {}
        D (double a, double b, double c, double d) : x (a), y (b), x2 (c), xy (d) {}
    };
    
    #define DE printf ("%lf %lf %lf %lf
    ", now->x, now->y, now->x2, now->xy);
    class Segment_Tree
    {
        private :
            
            S_D *Root;
        
            void Build (S_D *&now, int l, int r)
            {
                now = new S_D (l, r);
                if (l == r)
                {
                    now->x = (double)_x[l], now->y = (double)_y[r];
                    now->x2 = now->x * now->x;
                    now->xy = now->x * now->y;
                    return ;
                }
                Build (now->Left, l, now->Mid);
                Build (now->Right, now->Mid + 1, r);
                now->Up ();
            }
    
            void Change_1 (S_D *&now, int l, int r, double s, double t)
            {
                if (l <= now->l && now->r <= r)
                {
                    double L = (now->r - now->l + 1);
                    now->xy += t * now->x + s * now->y + s * t * L;
                    now->x2 += s * now->x + s * now->x + s * s * L;
                    now->x += s * L, now->y += t * L;
                    now->ss += s, now->st += t;
                    return ;
                }
                now->Down ();
                if (l <= now->Mid) Change_1 (now->Left, l, r, s, t);
                if (r > now->Mid) Change_1 (now->Right, l, r, s, t);
                now->Up ();
            }
    
            void Change_2 (S_D *&now, int l, int r, double s, double t)
            {
                if (l <= now->l && now->r <= r)
                {
                    double L = (now->r - now->l + 1);
                    now->tag = true;
                    now->ss = now->st = 0, now->ts = s, now->tt = t;
                    now->x = L * s + _i[now->r] - _i[now->l - 1];
                    now->y = L * t + _i[now->r] - _i[now->l - 1]; 
                    now->xy = L * s * t + (s + t) * (_i[now->r] - _i[now->l - 1]) + i2[now->r] - i2[now->l - 1];
                    now->x2 = L * s * s + 2 * s * (_i[now->r] - _i[now->l - 1]) + i2[now->r] - i2[now->l - 1];
                    return ;
                }
                now->Down ();
                if (l <= now->Mid) Change_2 (now->Left, l, r, s, t);
                if (r > now->Mid) Change_2 (now->Right, l, r, s, t);
                now->Up ();
            }
    
            D Query (S_D *&now, int l, int r)
            {
                if (l <= now->l && now->r <= r)
                    return     D (now->x, now->y, now->x2, now->xy);
                now->Down ();
                D A, B;
                if (l <= now->Mid) A = Query (now->Left, l, r);
                if (r > now->Mid) B = Query (now->Right, l, r);
                A.x += B.x, A.y += B.y;
                A.x2 += B.x2, A.xy += B.xy;
                return A;
            }
    
        public :
    
            inline void Build (int l, int r) { return Build (Root, l, r); }
            
            inline void Change_1 (int l, int r, double s, double t)
            {
                return Change_1 (Root, l, r, s, t);
            }
    
            inline void Change_2 (int l, int r, double s, double t)
            {
                return Change_2 (Root, l, r, s, t);
            }
            
            inline void Query (int l, int r)
            {
                D res = Query (Root, l, r); double s = r - l + 1;
                double b = res.xy - s * (res.x / s) * (res.y / s);
                b /= res.x2 - s * (res.x / s) * (res.x / s);
                printf ("%.10lf
    ", b);
            }
    };
    
    Segment_Tree Seg;
    
    int Main ()
    {
        fread (buf, 1, BUF, stdin);
        int N, M; read (N), read (M);
        register int i; int x;
        for (i = 1; i <= N; ++ i)
            read (x), _x[i] = (double) x;
        for (i = 1; i <= N; ++ i)
            read (x), _y[i] = (double) x;
        int type, y, s, t;
        for (i = 1; i <= N; ++ i)
            _i[i] = _i[i - 1] + i;
        for (i = 1; i <= N; ++ i)
            i2[i] = i2[i - 1] + i * i;
        Seg.Build (1, N);
        for (i = 1; i <= M; ++ i)
        {
            read (type);
            if (type == 1)
            {
                read (x), read (y);
                Seg.Query (x, y);
            }
            else if (type == 2)
            {
                read (x), read (y), read (s), read (t);
                Seg.Change_1 (x, y, (double) s, (double) t);
            }
            else if (type == 3)
            {
                read (x), read (y), read (s), read (t);
                Seg.Change_2 (x, y, (double) s, (double) t);
            }
        }
    
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    
    const int BUF = 12312312;
    char Buf[BUF], *buf = Buf;
    
    #define Mod 20170408
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    
    #define Max 20000007
    #define L 100
    struct Matrix
    {
        int c[L][L];
        Matrix () { memset (c, 0, sizeof c); }
    
        Matrix operator * (const Matrix &now) const
        {
            Matrix res;
            for (register int i = 0, j, k; i < L; ++ i)
                for (k = 0; k < L; ++ k)
                    if (this->c[i][k])
                        for (j = 0; j < L; ++ j)
                            res.c[i][j] = (res.c[i][j] + 1LL * this->c[i][k] * now.c[k][j]) % Mod;
            return res;    
        }
    };
    
    int operator ^ (Matrix A, int p)
    {
        Matrix res; res.c[0][0] = 1;
        for (; p; A = A * A, p >>= 1)
            if (p & 1)
                res = res * A;
        return res.c[0][0];
    }
    
    Matrix A;
    int prime[Max];
    bool is[Max];
    int C;
    
    void Euler (const int N)
    {
        is[1] = true;
        for (register int i = 2, j; i <= N; ++ i)
        {
            if (!is[i]) prime[++ C] = i;
            for (j = 1; i * prime[j] <= N && j <= C; ++ j)
            {
                is[i * prime[j]] = true;
                if (i % prime[j] == 0) break;
            }
        }
    }
    
    int data[Max];
    
    int Main ()
    {
        fread (buf, 1, BUF, stdin);
        int N, M, K; read (N), read (M), read (K);
        Euler (Max - 7); register int i, j;
    
        for (i = 1; i <= M; ++ i) ++ data[i % K];
        for (i = 0; i < K; ++ i) 
            for (j = 0; j < K; ++ j)
                A.c[i][(i + j) % K] = data[j] % Mod;
        int Answer = A ^ N; memset (A.c, 0, sizeof A.c);
        memset (data, 0, sizeof data);
        for (i = 1; i <= M; ++ i)
            if (is[i]) ++ data[i % K];
        for (i = 0; i < K; ++ i)
            for (j = 0; j < K; ++ j)
                A.c[i][(i + j) % K] = data[j] % Mod;
        Answer -= A ^ N;
    
        printf ("%d", (Answer + Mod) % Mod);
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    
    const int BUF = 12312312;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        bool temp = false;
        for (now = 0; !isdigit (*buf); ++ buf)
            if (*buf == '-')  temp = true;
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
        if (temp) now = -now;
    }
    #define Max 800009
    
    int x[Max], y[Max], s[Max];
    int rank[Max], father[Max];
    int Answer[Max], L, Stack[Max], top;
    int list[Max], next[Max];
    int N, M;
    
    void Dfs (int now)
    {
        Stack[++ top] = now;
        if (now <= M)
            for (int i = L; ; ++ i)
                if (Stack[top - i] >= now + M)
                {
                    Answer[now] = i;
                    break;
                }
        for (int i = list[now]; i; i = next[i])
            Dfs (i);
        -- top;
    }
    
    int Main ()
    {
        freopen ("1.in", "r", stdin);
        fread (buf, 1, BUF, stdin);
        read (N), read (M); M = 0;
        register int i;
        for (i = 1; i <= N; ++ i)
            read (x[i]), read (y[i]), rank[++ M] = x[i], rank[++ M] = y[i];
        std :: sort (rank + 1, rank + 1 + M);
        int Size = std :: unique (rank + 1, rank + 1 + M) - rank - 1;
        for (i = 1; i <= N; ++ i)
        {
            s[i] = x[i] = std :: lower_bound (rank + 1, rank + 1 + Size, x[i]) - rank;
            y[i] = std :: lower_bound (rank + 1, rank + 1 + Size, y[i]) - rank;
            if (x[i] < y[i])
            {
                if (father[x[i]] < y[i]) father[x[i]] = y[i];
                if (father[x[i] + M] < y[i] + M) father[x[i] + M] = y[i] + M;
            }
            else
            {
                if (father[1] < y[i]) father[1] = y[i];
                if (father[x[i]] < y[i] + M) father[x[i]] = y[i] + M;
                if (father[x[i] + M] < (M << 1)) father[x[i] + M] = (M << 1);
            }
        }
        for (i = 1; i <= (M << 1); ++ i)
            if (father[i] < father[i - 1]) 
                father[i] = father[i - 1];
        
        for (i = 1; i < (M << 1); ++ i)
            next[i] = list[father[i]], list[father[i]] = i;
    
        for (L = -1, i = 1; i <= M; i = father[i]) ++ L;    
        for (Dfs (M << 1), i = 1; i <= N; ++ i)
            printf ("%d ", Answer[s[i]]);    
        return 0;
    }
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
    #include <cstdio>
    #include <iostream>
    #define Max 1000002
    const int Mod = 1000000007; typedef long long LL;
    inline void read (LL &now)
    {
        register char c = getchar ();
        for (now = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); now = now * 10 + c - '0', c = getchar ());
    }
    struct MT
    {
    #define L 2
    #define Rg register int
        LL c[2][2];
        MT operator * (const MT A) const
        {
            MT res;
            for (Rg i = 0, j, k; i < L; ++ i) 
                for (j = 0; j < L; ++ j)
                {
                    res.c[i][j] = 0;
                    for (k = 0; k < L; ++ k)
                        res.c[i][j] = (res.c[i][j] + c[i][k] * A.c[k][j]) % Mod;
                }
            return res;
        }
    #undef L
    };
    LL operator ^ (MT A, register LL p)
    {
        MT res; res.c[0][0] = res.c[0][1] = res.c[1][0] = 1; res.c[1][1] = 0;
        if (p == 1 || p == 2) return 1; else if (p == 0) return 0;
        for (p -= 2; p; p >>= 1)
        {
            if (p & 1) res = res * A;
            A = A * A;
        }
        return res.c[0][0];
    }
    #undef Rg
    LL Gcd (LL a, LL b) { return !b ? a : Gcd (b, a % b); }
    MT A;
    
    int Main ()
    {
        freopen ("spfa.in", "r", stdin); freopen ("spfa.out", "w", stdout);
        LL N, M, P; read (N), read (M); register int i, j; P = Gcd (N, M);
        A.c[0][0] = A.c[0][1] = A.c[1][0] = 1, A.c[1][1] = 0;
        P = A ^ P; std :: cout << P;
        return 0;
    }
    int ZlycerQan = Main (); int main (int argc, char *argv[]) { return 0; }
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #define Max 1200202
    int c[Max];
    inline void read (int &now)
    {
        register char c = getchar ();
        for (now = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); now = now * 10 + c - '0', ++ c);
    }
    int Main ()
    {
        freopen ("small.in", "r", stdin); freopen ("small.out", "w", stdout);
        register int i; int N, T; read (T);
        for (i = 1; i <= T; ++ i)
        {
            read (N); for (i = 1; i <= N; ++ i) read (c[i]); 
            std :: sort (c + 1, c + 1 + N); 
            int S = std :: unique (c + 1, c + 1 + N) - c - 1;
            printf (S == N ? "Happy
    " : "Sad
    %d
    ", N - S);
        }
    }
    int ZlycerQan = Main (); int main (int argc, char *argv[]) { return 0; }
    #include <cstdio>
    #define Max 1000002
    int f[Max][2];
    #define INF 1e8
    int p[] = { 2, 3, 5, 7, 11 }; 
    inline void min (int &a, int b) { if (b < a) a = b; return ;}
    int Dfs (int n, int t)
    {
        if (n == 1) return 0; if (f[n][t]) return f[n][t]; f[n][t] = INF;
        register int i; 
        for (i = 0; i < 4; ++ i)
           if (!(n % p[i])) min (f[n][t], Dfs (n / p[i], 1) + p[i]);
        if (t == 0) return f[n][t]; f[n][0] = f[n][1];
        for (i = 1; i <= 2; ++ i) min (f[n][t], Dfs (n + i, 0) + i);
        return f[n][t];    
    }
    int Main () 
    {
        freopen ("huaji.in", "r", stdin); freopen ("huaji.out", "w", stdout);
        int N; scanf ("%d", &N); printf ("%d", Dfs (N, 1)); return 0; 
    }
    int ZlycerQan = Main (); int main (int argc, char *argv[]) { return 0; }
    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #define rg register
    inline void read (int &now)
    {
        rg char c = getchar ();
        for (now = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); now = now * 10 + c - '0', c = getchar ());
    }
    #define Max 1000009
    int f[Max], N, B, T, x, y;
    int Find (int x) { return f[x] == x ? x : f[x] = Find (f[x]); }
    int main ()
    {
        freopen ("dream.in", "r", stdin); freopen ("dream.out", "w", stdout);
        int i, j, a, b;
        for (read (T); T; -- T)
        {
            read (N), read (B),    read (x), read (y);
            for (i = 1; i <= N; ++ i) f[i] = i;
            for (i = B + 1; i <= N; ++ i)    
                for (j = i * 2; j <= N; j += i)
                {
                    a = Find (i), b = Find (j);
                    if (a != b) f[b] = a;
                }
            if (Find (x) == Find (y)) printf ("YeS
    ");
            else printf ("No
    ");
        }
        return 0;
    }
    #include <cstdio>
    #include <iostream>
    #define rg register 
    inline void read (int &now)
    {
        rg char c = getchar ();
        for (now = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); now = now * 10 + c - '0', c = getchar ());
    }
    #define Max 100009
    struct E { E *n; int v; } *list[Max], poor[Max << 1], *Ta = poor;
    int f[Max][Max / 5000 + 2], s[Max], fa[Max], v[Max], k;
    void Yukari (int n, int F)
    {
        fa[n] = F;
        for (E *e = list[n]; e; ++ v[n], e = e->n)
            if (e->v != F) Yukari (e->v, n);
    }
    void Dfs (int n)
    {
        for (E *e = list[n]; e; e = e->n)
        {
            int V; f[n][k] += f[V = e->v][k - 1];
            if (V == fa[n]) continue; Dfs (V);
        }
        if (k > 2) f[n][k] -= f[n][k - 2] * (v[n] - 1);
        if (k == 2) f[n][k] -= f[n][0] * v[n];
        s[n] += f[n][k];
    }
    int Main ()
    {
        freopen ("young.in", "r", stdin); freopen ("young.out", "w", stdout);
        int N, K, R, C, x, y; read (R), read (C), read (N), read (K); rg int i;
        for (i = 1; i < N; ++ i)
        {
            read (x), read (y);
            ++ Ta, Ta->v = y, Ta->n = list[x], list[x] = Ta;
            ++ Ta, Ta->v = x, Ta->n = list[y], list[y] = Ta;
        }
        Yukari (1, 0);
        for (i = 1; i <= N; ++ i) read (s[i]), f[i][0] = s[i];
        for (i = 1; i <= K; ++ i) k = i, Dfs (1);
        for (i = 1; i <= N; ++ i) printf ("%d
    ", s[i]);    
        return 0;
    }
    int ZlycerQan = Main (); int main (int argc, char *argv[]) { return 0; }
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #define rg register
    inline void read (int &now)
    {
        rg char c = getchar ();
        for (now = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); now = now * 10 + c - '0', c = getchar ());
    }
    int Main ()
    {
        freopen ("moon.in", "r", stdin); freopen ("moon.out", "w", stdout);
        int N; read (N); rg int i, j, Answer = 0; int x;
        for (i = 1; i <= N; ++ i) read (x), Answer -= x, read (x), Answer += x;
        for (i = 1; i <= N; ++ i) read (x), Answer += x, read (x), Answer -= x;
        printf ("%d", Answer);
        return 0;
    }
    int ZlycerQan = Main (); int main (int argc, char *argv[]) { return 0; }
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #define rg register
    inline void read (int &now)
    {
        rg char c = getchar ();
        for (now = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); now = now * 10 + c - '0', c = getchar ());
    }
    int Main ()
    {
        freopen ("moon.in", "r", stdin); freopen ("moon.out", "w", stdout);
        int N; read (N); rg int i, j, Answer = 0; int x;
        for (i = 1; i <= N; ++ i) read (x), Answer -= x, read (x), Answer += x;
        for (i = 1; i <= N; ++ i) read (x), Answer += x, read (x), Answer -= x;
        printf ("%d", Answer);
        return 0;
    }
    int ZlycerQan = Main (); int main (int argc, char *argv[]) { return 0; }
    #include <cstdio>
    #include <iostream>
    #include <string>
    #include <cstring>
    #define rg register
    #define Max 1000
    typedef long long LL;
    using std :: string;
    char l[Max]; int c[Max]; string Answer;
    int Main ()
    {
        freopen ("hwc.in", "r", stdin); freopen ("hwc.out", "w", stdout);
        scanf ("%s", l); rg int i, j; int Len = strlen (l);
        for (i = Len - 1; i >= 0; -- i)
        {
            c[i + 1] = l[i] - '0' + c[i + 2] / 10, c[i + 2] %= 10;
            if (i == Len - 1) ++ c[i + 1]; if (i == 0) -- c[i + 1];
        }
        bool f = false, p = false, e = false;
        for (i = 1; i <= Len; ++ i)
        {
            if (!c[i] && i == 1) { f = true; continue; }
            else if (!c[i] && i == 2 && f) p = true, Answer.push_back ('9');
            else Answer.push_back (c[i] + '0');
        }
        if (f && !p) e = true; else -- Len;
        for (i = Len; i >= 1; -- i)
        {
            if (!c[i] && i == 1) continue;
            else if (!c[i] && i == 2 && f) Answer.push_back ('9');
            else Answer.push_back (c[i] + '0');
        }
        std :: cout << Answer;
        return 0;
    }
    int ZlycerQan = Main (); int main (int argc, char *argv[]) { return 0; }
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #define rg register
    #define EPS 1e-3
    #define INF 1e7
    typedef double flo; const int BUF = 12312323; char Buf[BUF], *buf = Buf;
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    #define Max 1010
    struct E { E *n; int v, d; } *list[Max], poor[Max * 6], *Ta = poor;
    flo d[Max]; bool is[Max]; int c[Max];
    bool Check (int n, flo key)
    {
        is[n] = true;
        for (E *e = list[n]; e; e = e->n)
        {
            int V; flo r = c[(V = e->v)] - key * e->d;
            if (d[V] < d[n] + r)
                if (!is[V])
                {
                    d[V] = d[n] + r;
                    if (Check (V, key)) return true;
                }
                else return true;
        }
        return is[n] = false;
    }    
    int Main ()
    {
        fread (buf, 1, BUF, stdin);
        int N, M, x, y, z; read (N), read (M); rg int i, j; flo Answer;
        for (i = 1; i <= N; ++ i) read (c[i]);
        for (i = 1; i <= M; ++ i)
        {
            read (x), read (y), read (z); 
            ++ Ta, Ta->v = y, Ta->n = list[x], list[x] = Ta, Ta->d = z;
        }
        for (flo Mid, l = 0, r = 1000.0; r - l > EPS; )
        {
            Mid = (l + r) / 2.0;
            for (i = 1; i <= N; ++ i) d[i] = -INF;
            memset (is, false, sizeof is); d[1] = 0.0;
            if (Check (1, Mid)) l = Mid, Answer = Mid; else r = Mid;
        }
        printf ("%.2lf", Answer);
        return 0;
    }
    int ZlycerQan = Main (); int main (int argc, char *argv[]) { return 0; }
    #include <cstdio>
    #include <iostream>
    #define rg register
    #define INF 1e8
    void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    #define Max 100005
    struct SD 
    { 
        SD *L, *R; int v, k, Mid, l, r; 
        void Up () { v = L->v | R->v; }
    } poor[Max << 2], *null, *Ta = poor; int a[Max], N, M, A, B;
    
    class SegmentTree
    {
        private : SD *Root;
        private :
            SD *New (int x, int y)
            { 
                ++ Ta, Ta->L = Ta->R = null; Ta->v = 0; 
                Ta->Mid = x + y >> 1; Ta->l = x, Ta->r = y;
                return Ta;
            }
            void Build (SD *&n, int l, int r)
            {
                n = New (l, r); if (l == r) { n->v = 1; return ; }
                Build (n->L, l, n->Mid); Build (n->R, n->Mid + 1, r);
                n->k = 3; n->Up ();
            }
            void C (SD *&n, int p, int k)
            {
                if (n->l == n->r) { n->v = k; return ; }
                if (p <= n->Mid) C (n->L, p, k); else C (n->R, p, k); n->Up ();
                if (n->v) 
                { 
                    if (n->L->v && n->R->v) n->k = 3; 
                    else if (n->L->v) n->k = 1; else n->k = 2; return ;
                }
                n->k = 0;
            }
            int Q (SD *&n, int l, int r)
            {
                if (n->v == 0) return INF; int s = INF;
                if (l <= n->l && n->r <= r)
                {
                    if (n->l == n->r) return n->l;
                    if (n->k == 1 || n->k == 3) { s = Q (n->L, l, r); if (s != INF) return s; }
                    if (n->k == 2 || n->k == 3) { s = Q (n->R, l, r); if (s != INF) return s; }
                    return s;
                }
                if (l <= n->Mid && (n->k == 1 || n->k == 3))
                { s = Q (n->L, l, r); if (s != INF) return s; }
                if (r > n->Mid && (n->k == 2 || n->k == 3))
                { s = Q (n->R, l, r); if (s != INF) return s; }
                return INF;
            }
            
        public :
            
            inline void Build (int l, int r) 
            { Build (Root, l, r); C (a[1], 0), C (a[2], 0); }
            inline void C (int p, int k) { return C (Root, p, k); }
            inline int Q (int l, int r) { return Q (Root, l, r); }
    };
    SegmentTree Seg;
    int main (int argc, char *argv[])
    {
        freopen ("lunch.in", "r", stdin); freopen ("lunch.out", "w", stdout);
        rg int i, j; read (N), read (M), read (A), read (B), read (a[1]), read (a[2]);
        null = Ta; null->L = null->R = null; null->l = null->r = null->v = null->k = null->Mid = 0;
        Seg.Build (0, N - 1); int li = 1, ri = N / 2, r;
        for (i = 3; i <= M; ++ i)
        {
            for (; i - li > ri; Seg.C (a[li ++], 1));
            a[i] = (1LL * A * a[i - 1] + 1LL * B * a[i - 2]) % N;
            r = Seg.Q (a[i], N - 1);
            if (r != INF) { a[i] = r; Seg.C (a[i], 0); }
            else { a[i] = Seg.Q (0, a[i] - 1); Seg.C (a[i], 0); }
            printf ("%d ", a[i]);
        }
        fclose (stdin); fclose (stdout); return 0;
    }
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #define rg register
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    #define Max 1000005
    struct E { E *n; int v; } *list[Max], poor[Max << 1], *Ta = poor;
    int m[Max], _m[Max], l[Max], Maxn, MaxP, Answer; bool is[Max];
    void Dfs (int n, int F)
    {
        for (E *e = list[n]; e; e = e->n)
            if (e->v != F)
                l[e->v] = l[n] + 1, Dfs (e->v, n);
        if (l[n] > Maxn) Maxn = l[n], MaxP = n;
    }
    int pre[Max];
    void _Dfs (int n, int F)
    {
        for (E *e = list[n]; e; e = e->n)
            if (e->v != F)
                l[e->v] = l[n] + 1, _Dfs (e->v, n), pre[e->v] = n;
        if (l[n] > Maxn) Maxn = l[n], MaxP = n;
    }
    inline void max (int &a, int b) { if (b > a) a = b; }
    void Get (int n)
    {
        for (E *e = list[n]; e; e = e->n)
            if (!is[e->v]) l[e->v] = l[n] + 1, is[e->v] = true, Get (e->v); 
        max (Answer, l[n]);
    }
    int main (int argc, char *argv[])
    {
        freopen ("tree.in", "r", stdin); freopen ("tree.out", "w", stdout);
        rg int i, j; int N, x, y; read (N);
        for (i = 1; i < N; ++ i) 
        {
            read (x), read (y);
            ++ Ta, Ta->v = y, Ta->n = list[x], list[x] = Ta;
            ++ Ta, Ta->v = x, Ta->n = list[y], list[y] = Ta;
        }
        Dfs (1, 0); memset (l, 0, sizeof l); 
        Maxn = 0; int S = MaxP; _Dfs (MaxP, 0);
        for (i = MaxP, is[S] = true; i != S; i = pre[i]) is[i] = true;
        memset (l, 0, sizeof l);
        for (i = 1; i <= N; ++ i) if (is[i]) Get (i);
        printf ("%d", Answer);
        fclose (stdin); fclose (stdout); return 0;
    }
    #include <cstdio>
    #include <iostream>
    #include <cmath>
    #include <algorithm>
    #define rg register
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    int N, M, Q;
    #define Max 200009
    int c[Max], b[Max], key[Max], Answer;
    struct Q 
    { 
        int id, l, r; 
        bool operator < (const Q &A) const
        {
            return b[l] == b[A.l] ? r < A.r : b[l] < b[A.l];
        }
    } q[Max];
    int Zly[Max];
    void make (int n, int k, bool t)
    {
        key[c[n]] += k;
        if (t)
        {
            if (c[n] < Answer && !key[c[n]] && !key[c[n] + 1]) Answer = c[n];
            if (c[n] - 1 < Answer && !key[c[n] - 1] && !key[c[n]] && c[n] - 1 != 0) Answer = c[n] - 1;
        }
        else if (c[n] == Answer || c[n] == Answer + 1) for (; key[Answer] || key[Answer + 1]; ++ Answer);
    }
    int main (int argc, char *argv[])
    {
        freopen ("stall.in", "r", stdin); freopen ("stall.out", "w", stdout);
        read (N), read (M), read (Q); int K_Size = sqrt (M); rg int i;
        for (i = 1; i <= M; ++ i) read (c[i]), b[i] = (i + 1) / K_Size;
        for (i = 1; i <= Q; ++ i) q[i].id = i, read (q[i].l), read (q[i].r);
        std :: sort (q + 1, q + 1 + Q); int l = 1, r = 0; Answer = 1;
        for (i = 1; i <= Q; ++ i)
        {
            for (; l < q[i].l; make (l ++, -1, true));
            for (; l > q[i].l; make (-- l, 1, false));
            for (; r < q[i].r; make (++ r, 1, false));
            for (; r > q[i].r; make (r --, -1, true));
            Zly[q[i].id] = Answer; if (Answer > N) Zly[q[i].id] = -1;
        }
        for (i = 1; i <= Q; ++ i) 
        {
            if (Zly[i] == -1) printf ("-1 -1
    ");
            else printf ("%d %d
    ", Zly[i], Zly[i] + 1);
        }
        fclose (stdin); fclose (stdout); return 0;
    }
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define rg register
    #define Max 10005
    int N, M, C, Scc, ind, top, v[Max],w[Max], sv[Max],sw[Max]; bool in_stack[Max];
    int dfn[Max],low[Max],belong[Max], stack[Max],f[Max][2505],in[2505];
    inline int min (int a, int b) { return a < b ? a : b; }
    inline int max (int a, int b) { return a > b ? a : b; }
    struct E { E *n; int v; } *list1[Max * 10], poor[Max * 20], *Ta = poor, *list2[Max * 10];
    inline int read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    void Tarjan (int u)
    {
        int now = 0; E *e;
        dfn[u] = low[u] = ++ ind, stack[++ top] = u, in_stack[u] = 1;
        for (e = list1[u]; e; e = e->n)
        {
            int v = e->v;
            if (!dfn[v]) Tarjan(v), low[u] = min (low[u], low[v]);
            else if (in_stack[v]) low[u] = min (low[u], dfn[v]);
        }
        if (low[u] == dfn[u])
            for (++ Scc; now != u; )
            {
                now = stack[top --]; in_stack[now] = 0;
                belong[now] = Scc, sw[Scc] += w[now], sv[Scc] += v[now];
            }
    }
    void dp(int x)
    {
        rg int i, j, k; E *e;
        for (e = list2[x]; e; e = e->n)
        {
            dp (e->v);
            for (j = M - sw[x]; j >= 0; -- j) 
                for (k = 0; k <= j; ++ k) f[x][j] = max (f[x][j], f[x][k] + f[e->v][j - k]);
        }
        for (j = M; j >= 0; -- j) { if (j >= sw[x]) f[x][j] = f[x][j - sw[x]] + sv[x]; else f[x][j]=0; }
    }
    int main (int argc, char *argv[])
    {
        freopen ("T1.in", "r", stdin); freopen ("T1.out", "w", stdout);
        int x; read (N), read (M); rg int i; E *e;
        for (i = 1; i <= N; ++ i) read (w[i]);
        for (i = 1; i <= N; ++ i) read (v[i]);
        for (i = 1; i <= N; ++ i) { read (x); if (x) ++ Ta, Ta->v = i, Ta->n = list1[x], list1[x] = Ta; }
        for (i = 1; i <= N; ++ i) if (!dfn[i]) Tarjan (i);
        int v;
        for (x = 1; x <= N; ++ x)
            for (e = list1[x]; e; e = e->n)
                if (belong[(v = e->v)] != belong[x])
                    ++ Ta, Ta->v = belong[v], Ta->n = list2[belong[x]], list2[belong[x]] = Ta, in[belong[v]] = 1;
        for (i = 1; i <= Scc; ++ i) if(!in[i]) ++ Ta, Ta->v = i, Ta->n = list2[Scc + 1], list2[Scc + 1] = Ta, in[i] = 1; 
        dp (Scc + 1); printf ("%d
    ", f[Scc + 1][M]); return 0;
    }
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    
    #define Max 400010
    #define INF 233333333
    
    int head[Max], nxt[Max], to[Max], tot = 0, num[Max];
    inline int min (int a, int b) { return a < b ? a : b; }
    inline int max (int a, int b) { return a > b ? a : b; }
    int maxn[Max][30],minn[Max][30],anc[Max][30],ans1[Max][30],ans2[Max][30], deep[Max];
    const int BUF = 12312323; char Buf[BUF], *buf = Buf;
    void read (int &n)
    {
        for (n = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); n = n * 10 + *buf - '0', ++ buf);
    }
    inline void cmax (int &a, int b) { if (b > a) a = b; }
    inline void cmin (int &a, int b) { if (b < a) a = b; }
    class SegmentTree
    {
        private :
            
            struct SD 
            { 
                SD *L, *R; int vu, vd, mx, mn, l, r, Mid; 
                inline void Up ()
                {
                    mx = max (L->mx, R->mx), mn = min (L->mn, R->mn);
                    vu = R->mx - L->mn, vd = L->mx - R->mn;
                }
            } *Root, poor_T[Max << 2], *TT;
            inline SD* New (int x, int y)
            {
                ++ TT, TT->l = x, TT->r = y, TT->Mid = x + y >> 1;
                TT->mx = TT->mn = TT->vu = TT->vd = 0; TT->L = TT->R = NULL; return TT;
            }
            void Build (SD *&n, int l, int r)
            {
                n = New (l, r); if (l == r) { n->mx = n->mn = 0; return ; }
                Build (n->L, l, n->Mid), Build (n->R, n->Mid + 1, r); n->Up ();
            }
            int Q (SD *&n, int l, int r, bool t)
            {
                if (l <= n->l && n->r <= r) { if (t) return n->mx; return n->mn; } int A = 0;
                if (l <= n->Mid) A = Q (n->L, l, r, t); 
                if (r > n->Mid) { if (t) cmax (A, Q (n->R, l, r, t)); else cmin (A, Q (n->R, l, r, t)); };
                return A;
            }
        public :
            SegmentTree () { TT = poor_T; }
            void Build (int l, int r) { return Build (Root, l, r); }
            int Q_max (int l, int r) { return Q (Root, l, r, true); }
            int Q_min (int l, int r) { return Q (Root, l, r, false); }
    };
    inline void build (int f, int t) { to[++tot]=t, nxt[tot]=head[f], head[f]=tot; }
    void dfs (int u, int fa)
    {
        if(deep[u]) return ; register int i;
        deep[u] = deep[fa]+1; minn[u][0] = min (num[u], num[fa]);
        maxn[u][0] = max (num[u], num[fa]); ans1[u][0] = max (0, num[u] - num[fa]);
        ans2[u][0] = max (0, num[fa] - num[u]); anc[u][0] = fa;
        for(int i=1;anc[u][i - 1];i++)
        {
            anc[u][i] = anc[anc[u][i - 1]][i - 1];
            maxn[u][i] = max (maxn[u][i - 1], maxn[anc[u][i - 1]][i - 1]);
            minn[u][i] = min (minn[u][i - 1], minn[anc[u][i - 1]][i - 1]);    
            ans1[u][i] = max (max (ans1[u][i - 1], ans1[anc[u][i - 1]][i - 1]), maxn[u][i - 1] - minn[anc[u][i - 1]][i - 1]);
            ans2[u][i] = max (max (ans2[u][i - 1], ans2[anc[u][i - 1]][i - 1]), maxn[anc[u][i - 1]][i - 1] - minn[u][i - 1]);
        }
        for (i = head[u]; i; i = nxt[i]) dfs(to[i],u);
    }
    inline void swap (int &a, int &b) { int c = a; a = b, b = c; }
    int asklca (int x, int y)
    {
        int ans = 0; register int i;
        if(deep[x]<deep[y]) swap(x,y);
        if (deep[x] > deep[y])
        {
            int dd = deep[x] - deep[y];
            for(i = 24; i >= 0; -- i)
                if (dd & (1 << i)) x = anc[x][i];
        }
        if (x != y)
            for(i = 24; i >= 0; -- i)
                if(anc[x][i] != anc[y][i]) x = anc[x][i], y = anc[y][i];
        if (x == y) return x; else return anc[x][0];
    }
    int ask (int x, int y)
    {
        int lca = asklca(x,y);
        int maxx = -INF, minnn = INF, ans = 0;
        int dd1 = deep[x] - deep[lca];
        if (dd1 > 0)
            for (int i = 24; i >= 0; -- i)
                if (dd1 & (1 << i))
                {
                    ans = max (ans, max (ans2[x][i], maxn[x][i] - minnn));
                    minnn = min (minn[x][i], minnn); x = anc[x][i];
                }
        int dd2 = deep[y] - deep[lca];
        if (dd2 > 0)
            for (int i = 24; i >= 0; -- i)
                if (dd2 & (1 << i))
                {
                    ans = max (ans, max (ans1[y][i], maxx - minn[y][i]));
                    maxx = max (maxn[y][i], maxx); y = anc[y][i];
                }
        return max (ans, maxx - minnn);
    }
    int main (int argc, char *argv[])
    {
        freopen ("T2.in", "r", stdin); freopen ("T2.out", "w", stdout); 
        register int i, j;
        fread (buf, 1, BUF, stdin); int n; read (n);
        for (i = 1; i <= n; ++ i) read (num[i]);
        for (i = 1;i < n; ++ i)
        {
            int a,b;
            read (a), read (b);
            build(a,b); build(b,a);
        }   
        dfs(1,0); int q; read (q);
        for (int x, y; q --; )
            read (x), read (y), printf("%d
    ",ask(x,y));
        return 0;
    }
    跪膜myj%%%%%%%
    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int INF=0x3f3f3f3f; int n,m,q,p,sx,sy,sz,sd,ex,ey,ez,ed,ans; bool vis[23][23][23]; inline void in(int &now) { char Cget;now=0;while((Cget=getchar())>'9'||Cget<'0'); while(Cget>='0'&&Cget<='9')now=now*10+Cget-'0',Cget=getchar(); } void dfs(int x,int y,int z,int d,int step) { if(step>=ans) return; if(x==ex&&ey==y&&ez==z&&d==ed) { ans=step; return; } if(step==12) return; if(x==ex&&y==ey&&z==ez) return; if(abs(ex-x)+abs(ey-y)+abs(ez-z)>(ans-step)*4) return; if(d==1) { if(z+2<=q) if(!vis[x][y][z+1]&&!vis[x][y][z+2]) { vis[x][y][z+1]=vis[x][y][z+2]=true; if(y+2<=m) if(!vis[x][y+1][z+2]&&!vis[x][y+2][z+2]) { vis[x][y+1][z+2]=vis[x][y+2][z+2]=true; dfs(x,y+2,z+2,5,step+1); vis[x][y+1][z+2]=vis[x][y+2][z+2]=false; } if(y-2>=1) if(!vis[x][y-1][z+2]&&!vis[x][y-2][z+2]) { vis[x][y-1][z+2]=vis[x][y-2][z+2]=true; dfs(x,y-2,z+2,2,step+1); vis[x][y-1][z+2]=vis[x][y-2][z+2]=false; } if(x+2<=n) if(!vis[x+1][y][z+2]&&!vis[x+2][y][z+2]) { vis[x+1][y][z+2]=vis[x+2][y][z+2]=true; dfs(x+2,y,z+2,3,step+1); vis[x+1][y][z+2]=vis[x+2][y][z+2]=false; } if(x-2>=1) if(!vis[x-1][y][z+2]&&!vis[x-2][y][z+2]) { vis[x-1][y][z+2]=vis[x-2][y][z+2]=true; dfs(x-2,y,z+2,6,step+1); vis[x-1][y][z+2]=vis[x-2][y][z+2]=false; } vis[x][y][z+1]=vis[x][y][z+2]=false; } if(z-1>=1) if(!vis[x][y][z-1]&&!vis[x][y][z]) { vis[x][y][z]=vis[x][y][z-1]=true; if(y+2<=m) if(!vis[x][y+1][z-1]&&!vis[x][y+2][z-1]) { vis[x][y+1][z-1]=vis[x][y+2][z-1]=true; dfs(x,y+2,z-1,5,step+1); vis[x][y+1][z-1]=vis[x][y+2][z-1]=false; } if(y-2>=1) if(!vis[x][y-1][z-1]&&!vis[x][y-2][z-1]) { vis[x][y-1][z-1]=vis[x][y-2][z-1]=true; dfs(x,y-2,z-1,2,step+1); vis[x][y-1][z-1]=vis[x][y-2][z-1]=false; } if(x+2<=n) if(!vis[x+1][y][z-1]&&!vis[x+2][y][z-1]) { vis[x+1][y][z-1]=vis[x+2][y][z-1]=true; dfs(x+2,y,z-1,3,step+1); vis[x+1][y][z-1]=vis[x+2][y][z-1]=false; } if(x-2>=1) if(!vis[x-1][y][z-1]&&!vis[x-2][y][z-1]) { vis[x-1][y][z-1]=vis[x-2][y][z-1]=true; dfs(x-2,y,z-1,6,step+1); vis[x-1][y][z-1]=vis[x-2][y][z-1]=false; } vis[x][y][z]=vis[x][y][z-1]=false; } if(z+3<=q) if(!vis[x][y][z+1]&&!vis[x][y][z+2]&&!vis[x][y][z+3]) { vis[x][y][z+1]=vis[x][y][z+2]=vis[x][y][z+3]=true; if(y+1<=m) if(!vis[x][y+1][z+3]) { vis[x][y+1][z+3]=true; dfs(x,y+1,z+3,5,step+1); vis[x][y+1][z+3]=false; } if(y-1<=m) if(!vis[x][y-1][z+3]) { vis[x][y-1][z+3]=true; dfs(x,y-1,z+3,2,step+1); vis[x][y-1][z+3]=false; } if(x+1<=m) if(!vis[x+1][y][z+3]) { vis[x+1][y][z+3]=true; dfs(x+1,y,z+3,3,step+1); vis[x+1][y][z+3]=false; } if(x-1<=m) if(!vis[x-1][y][z+3]) { vis[x-1][y][z+3]=true; dfs(x-1,y,z+3,6,step+1); vis[x-1][y][z+3]=false; } vis[x][y][z+1]=vis[x][y][z+2]=vis[x][y][z+3]=false; } if(z-2>=1) if(!vis[x][y][z]&&!vis[x][y][z-1]&&!vis[x][y][z-2]) { vis[x][y][z]=vis[x][y][z-1]=vis[x][y][z-2]=true; if(y+1<=m) if(!vis[x][y+1][z-2]) { vis[x][y+1][z-2]=true; dfs(x,y+1,z-2,5,step+1); vis[x][y+1][z-2]=false; } if(y-1<=m) if(!vis[x][y-1][z-2]) { vis[x][y-1][z-2]=true; dfs(x,y-1,z-2,2,step+1); vis[x][y-1][z-2]=false; } if(x+1<=m) if(!vis[x+1][y][z-2]) { vis[x+1][y][z-2]=true; dfs(x+1,y,z-2,3,step+1); vis[x+1][y][z-2]=false; } if(x-1<=m) if(!vis[x-1][y][z-2]) { vis[x-1][y][z-2]=true; dfs(x-1,y,z-2,6,step+1); vis[x-1][y][z-2]=false; } vis[x][y][z]=vis[x][y][z-2]=vis[x][y][z-1]=false; } } if(d==2) { if(y+1<=m) if(!vis[x][y][z]&&!vis[x][y+1][z]) { vis[x][y][z]=vis[x][y+1][z]=true; if(z+2<=q) if(!vis[x][y+1][z+2]&&!vis[x][y+1][z+1]) { vis[x][y+1][z+2]=vis[x][y+1][z+1]=true; dfs(x,y+1,z+2,1,step+1); vis[x][y+1][z+2]=vis[x][y+1][z+1]=false; } if(z-2>=1) if(!vis[x][y+1][z-1]&&!vis[x][y+1][z-2]) { vis[x][y+1][z-1]=vis[x][y+1][z-2]=true; dfs(x,y+1,z-2,4,step+1); vis[x][y+1][z-1]=vis[x][y+1][z-2]=false; } if(x+2<=n) if(!vis[x+1][y+1][z]&&!vis[x+2][y+1][z]) { vis[x+1][y+1][z]=vis[x+2][y+1][z]=true; dfs(x+2,y+1,z,3,step+1); vis[x+1][y+1][z]=vis[x+2][y+1][z]=false; } if(x-2>=1) if(!vis[x-1][y+1][z]&&!vis[x-2][y+1][z]) { vis[x-1][y+1][z]=vis[x-2][y+1][z]=true; dfs(x-2,y+1,z,6,step+1); vis[x-1][y+1][z]=vis[x-2][y+1][z]=false; } vis[x][y][z]=vis[x][y+1][z]=false; } if(y-2>=1) if(!vis[x][y-1][z]&&!vis[x][y-2][z]) { vis[x][y-1][z]=vis[x][y-2][z]=true; if(z+2<=q) if(!vis[x][y-2][z+1]&&!vis[x][y-2][z+2]) { vis[x][y-2][z+1]=vis[x][y-2][z+2]=true; dfs(x,y-2,z+2,1,step+1); vis[x][y-2][z+1]=vis[x][y-2][z+2]=false; } if(z-2>=1) if(!vis[x][y-2][z-1]&&!vis[x][y-2][z-2]) { vis[x][y-2][z-1]=vis[x][y-2][z-2]=true; dfs(x,y-2,z-2,4,step+1); vis[x][y-2][z-1]=vis[x][y-2][z-2]=false; } if(x+2<=n) if(!vis[x+1][y-2][z]&&!vis[x+2][y-2][z]) { vis[x+1][y-2][z]=vis[x+2][y-2][z]=true; dfs(x+2,y-2,z,3,step+1); vis[x+1][y-2][z]=vis[x+2][y-2][z]=false; } if(x-2>=1) if(!vis[x-1][y-2][z]&&!vis[x-2][y-2][z]) { vis[x-1][y-2][z]=vis[x-2][y-2][z]=true; dfs(x-2,y-2,z,6,step+1); vis[x-1][y-2][z]=vis[x-2][y-2][z]=false; } vis[x][y-1][z]=vis[x][y-2][z]=false; } if(y+2<=m) if(!vis[x][y][z]&&!vis[x][y+1][z]&&!vis[x][y+2][z]) { vis[x][y][z]=vis[x][y+1][z]=vis[x][y+2][z]=true; if(z+1<=q) if(!vis[x][y+2][z+1]) { vis[x][y+2][z+1]=true; dfs(x,y+2,z+1,1,step+1); vis[x][y+2][z+1]=false; } if(z-1>=1) if(!vis[x][y+2][z-1]) { vis[x][y+2][z-1]=true; dfs(x,y+2,z-1,4,step+1); vis[x][y+2][z-1]=false; } if(x+1<=n) if(!vis[x+1][y+2][z]) { vis[x+1][y+2][z]=true; dfs(x+1,y+2,z,3,step+1); vis[x+1][y+2][z]=false; } if(x-1>=1) if(!vis[x-1][y+2][z]) { vis[x-1][y+2][z]=true; dfs(x-1,y+2,z,6,step+1); vis[x-1][y+2][z]=false; } vis[x][y][z]=vis[x][y+1][z]=vis[x][y+2][z]=false; } if(y-3>=1) if(!vis[x][y-1][z]&&!vis[x][y-2][z]&&!vis[x][y-3][z]) { vis[x][y-1][z]=vis[x][y-2][z]=vis[x][y-3][z]=true; if(z+1<=q) if(!vis[x][y-3][z+1]) { vis[x][y-3][z+1]=true; dfs(x,y-3,z+1,1,step+1); vis[x][y-3][z+1]=false; } if(z-1>=1) if(!vis[x][y-3][z-1]) { vis[x][y-3][z-1]=true; dfs(x,y-3,z-1,4,step+1); vis[x][y-3][z-1]=false; } if(x+1<=n) if(!vis[x+1][y-3][z]) { vis[x+1][y-3][z]=true; dfs(x+1,y-3,z,3,step+1); vis[x+1][y-3][z]=false; } if(x-1>=1) if(!vis[x-1][y-3][z]) { vis[x-1][y-3][z]=true; dfs(x-1,y-3,z,6,step+1); vis[x-1][y-3][z]=false; } vis[x][y-1][z]=vis[x][y-2][z]=vis[x][y-3][z]=false; } } if(d==3) { if(x+2<=n) if(!vis[x+1][y][z]&&!vis[x+2][y][z]) { vis[x+1][y][z]=vis[x+2][y][z]=true; if(z+2<=q) if(!vis[x+2][y][z+1]&&!vis[x+2][y][z+2]) { vis[x+2][y][z+1]=vis[x+2][y][z+2]=true; dfs(x+2,y,z+2,1,step+1); vis[x+2][y][z+1]=vis[x+2][y][z+2]=false; } if(z-2>=1) if(!vis[x+2][y][z-1]&&!vis[x+2][y][z-2]) { vis[x+2][y][z-1]=vis[x+2][y][z-2]=true; dfs(x+2,y,z-2,4,step+1); vis[x+2][y][z-1]=vis[x+2][y][z-2]=false; } if(y+2<=m) if(!vis[x+2][y+1][z]&&!vis[x+2][y+2][z]) { vis[x+2][y+1][z]=vis[x+2][y+2][z]=true; dfs(x+2,y+2,z,5,step+1); vis[x+2][y+1][z]=vis[x+2][y+2][z]=false; } if(y-2>=1) if(!vis[x+2][y-1][z]&&!vis[x+2][y-2][z]) { vis[x+2][y-1][z]=vis[x+2][y-2][z]=true; dfs(x+2,y-2,z,2,step+1); vis[x+2][y-1][z]=vis[x+2][y-2][z]=false; } vis[x+1][y][z]=vis[x+2][y][z]=false; } if(x-1>=1) if(!vis[x][y][z]&&!vis[x-1][y][z]) { vis[x][y][z]=vis[x-1][y][z]=true; if(z+2<=q) if(!vis[x-1][y][z+1]&&!vis[x-1][y][z+2]) { vis[x-1][y][z+1]=vis[x-1][y][z+2]=true; dfs(x-1,y,z+2,1,step+1); vis[x-1][y][z+1]=vis[x-1][y][z+2]=false; } if(z-2>=1) if(!vis[x-1][y][z-1]&&!vis[x-1][y][z-2]) { vis[x-1][y][z-1]=vis[x-1][y][z-2]=true; dfs(x-1,y,z-2,4,step+1); vis[x-1][y][z-1]=vis[x-1][y][z-2]=false; } if(y+2<=m) if(!vis[x-1][y+1][z]&&!vis[x-1][y+2][z]) { vis[x-1][y+1][z]=vis[x-1][y+2][z]=true; dfs(x-1,y+2,z,5,step+1); vis[x-1][y+1][z]=vis[x-1][y+2][z]=false; } if(y-2>=1) if(!vis[x-1][y-1][z]&&!vis[x-1][y-2][z]) { vis[x-1][y-1][z]=vis[x-1][y-2][z]=true; dfs(x-1,y-2,z,2,step+1); vis[x-1][y-1][z]=vis[x-1][y-2][z]=false; } vis[x][y][z]=vis[x-1][y][z]=false; } if(x+3<=n) if(!vis[x+1][y][z]&&!vis[x+2][y][z]&&!vis[x+3][y][z]) { vis[x+1][y][z]=vis[x+2][y][z]=vis[x+3][y][z]=true; if(y+1<=m) if(!vis[x+3][y+1][z]) { vis[x+3][y+1][z]=true; dfs(x+3,y+1,z,5,step+1); vis[x+3][y+1][z]=false; } if(y-1>=1) if(!vis[x+3][y-1][z]) { vis[x+3][y-1][z]=true; dfs(x+3,y-1,z,2,step+1); vis[x+3][y-1][z]=false; } if(z+1<=q) if(!vis[x+3][y][z+1]) { vis[x+3][y][z+1]=true; dfs(x+3,y,z+1,1,step+1); vis[x+3][y][z+1]=false; } if(z-1>=1) if(!vis[x+3][y][z-1]) { vis[x+3][y][z-1]=true; dfs(x+3,y,z-1,4,step+1); vis[x+3][y][z-1]=false; } vis[x+1][y][z]=vis[x+2][y][z]=vis[x+3][y][z]=false; } if(x-2>=1) if(!vis[x][y][z]&&!vis[x-1][y][z]&&!vis[x-2][y][z]) { vis[x][y][z]=vis[x-1][y][z]=vis[x-2][y][z]=true; if(y+1<=m) if(!vis[x-2][y+1][z]) { vis[x-2][y+1][z]=true; dfs(x-2,y+1,z,5,step+1); vis[x-2][y+1][z]=false; } if(y-1>=1) if(!vis[x-2][y-1][z]) { vis[x-2][y-1][z]=true; dfs(x-2,y-1,z,2,step+1); vis[x-2][y-1][z]=false; } if(z+1<=q) if(!vis[x-2][y][z+1]) { vis[x-2][y][z+1]=true; dfs(x-2,y,z+1,1,step+1); vis[x-2][y][z+1]=false; } if(z-1>=1) if(!vis[x-2][y][z-1]) { vis[x-2][y][z-1]=true; dfs(x-2,y,z-1,4,step+1); vis[x-2][y][z-1]=false; } vis[x][y][z]=vis[x-1][y][z]=vis[x-2][y][z]=false; } } if(d==4) { if(z+1<=q) if(!vis[x][y][z]&&!vis[x][y][z+1]) { vis[x][y][z]=vis[x][y][z+1]=true; if(y+2<=m) if(!vis[x][y+1][z+1]&&!vis[x][y+2][z+1]) { vis[x][y+1][z+1]=vis[x][y+2][z+1]=true; dfs(x,y+2,z+1,5,step+1); vis[x][y+1][z+1]=vis[x][y+2][z+1]=false; } if(y-2>=1) if(!vis[x][y-1][z+1]&&!vis[x][y-2][z+1]) { vis[x][y-1][z+1]=vis[x][y-2][z+1]=true; dfs(x,y-2,z+1,2,step+1); vis[x][y-1][z+1]=vis[x][y-2][z+1]=false; } if(x+2<=n) if(!vis[x+1][y][z+1]&&!vis[x+2][y][z+1]) { vis[x+1][y][z+1]=vis[x+2][y][z+1]=true; dfs(x+2,y,z+1,3,step+1); vis[x+1][y][z+1]=vis[x+2][y][z+1]=false; } if(x-2>=1) if(!vis[x-1][y][z+1]&&!vis[x-2][y][z+1]) { vis[x-1][y][z+1]=vis[x-2][y][z+1]=true; dfs(x-2,y,z+1,6,step+1); vis[x-1][y][z+1]=vis[x-2][y][z+1]=false; } vis[x][y][z]=vis[x][y][z+1]=false; } if(z-2>=1) if(!vis[x][y][z-2]&&!vis[x][y][z-1]) { vis[x][y][z-1]=vis[x][y][z-2]=true; if(y+2<=m) if(!vis[x][y+1][z-2]&&!vis[x][y+2][z-2]) { vis[x][y+1][z-2]=vis[x][y+2][z-2]=true; dfs(x,y+2,z-2,5,step+1); vis[x][y+1][z-2]=vis[x][y+2][z-2]=false; } if(y-2>=1) if(!vis[x][y-1][z-2]&&!vis[x][y-2][z-2]) { vis[x][y-1][z-2]=vis[x][y-2][z-2]=true; dfs(x,y-2,z-2,2,step+1); vis[x][y-1][z-2]=vis[x][y-2][z-2]=false; } if(x+2<=n) if(!vis[x+1][y][z-2]&&!vis[x+2][y][z-2]) { vis[x+1][y][z-2]=vis[x+2][y][z-2]=true; dfs(x+2,y,z-2,3,step+1); vis[x+1][y][z-2]=vis[x+2][y][z-2]=false; } if(x-2>=1) if(!vis[x-1][y][z-2]&&!vis[x-2][y][z-2]) { vis[x-1][y][z-2]=vis[x-2][y][z-2]=true; dfs(x-2,y,z-2,6,step+1); vis[x-1][y][z-2]=vis[x-2][y][z-2]=false; } vis[x][y][z-1]=vis[x][y][z-2]=false; } if(z+2<=q) if(!vis[x][y][z]&&!vis[x][y][z+1]&&!vis[x][y][z+2]) { vis[x][y][z+1]=vis[x][y][z]=vis[x][y][z+2]=true; if(y+1<=m) if(!vis[x][y+1][z+2]) { vis[x][y+1][z+2]=true; dfs(x,y+1,z+2,5,step+1); vis[x][y+1][z+2]=false; } if(y-1<=m) if(!vis[x][y-1][z+2]) { vis[x][y-1][z+2]=true; dfs(x,y-1,z+2,2,step+1); vis[x][y-1][z+2]=false; } if(x+1<=m) if(!vis[x+1][y][z+2]) { vis[x+1][y][z+2]=true; dfs(x+1,y,z+2,3,step+1); vis[x+1][y][z+2]=false; } if(x-1<=m) if(!vis[x-1][y][z+2]) { vis[x-1][y][z+2]=true; dfs(x-1,y,z+2,6,step+1); vis[x-1][y][z+2]=false; } vis[x][y][z+1]=vis[x][y][z+2]=vis[x][y][z]=false; } if(z-3>=1) if(!vis[x][y][z-1]&&!vis[x][y][z-2]&&!vis[x][y][z-3]) { vis[x][y][z-1]=vis[x][y][z-2]=vis[x][y][z-3]=true; if(y+1<=m) if(!vis[x][y+1][z-3]) { vis[x][y+1][z-3]=true; dfs(x,y+1,z-3,5,step+1); vis[x][y+1][z-3]=false; } if(y-1<=m) if(!vis[x][y-1][z-3]) { vis[x][y-1][z-3]=true; dfs(x,y-1,z-3,2,step+1); vis[x][y-1][z-3]=false; } if(x+1<=m) if(!vis[x+1][y][z-3]) { vis[x+1][y][z-3]=true; dfs(x+1,y,z-2,3,step+1); vis[x+1][y][z-3]=false; } if(x-1<=m) if(!vis[x-1][y][z-3]) { vis[x-1][y][z-3]=true; dfs(x-1,y,z-3,6,step+1); vis[x-1][y][z-3]=false; } vis[x][y][z-3]=vis[x][y][z-2]=vis[x][y][z-1]=false; } } if(d==5) { if(y+2<=m) if(!vis[x][y+1][z]&&!vis[x][y+2][z]) { vis[x][y+1][z]=vis[x][y+2][z]=true; if(z+2<=q) if(!vis[x][y+2][z+2]&&!vis[x][y+2][z+1]) { vis[x][y+2][z+2]=vis[x][y+2][z+1]=true; dfs(x,y+2,z+2,1,step+1); vis[x][y+2][z+2]=vis[x][y+2][z+1]=false; } if(z-2>=1) if(!vis[x][y+2][z-1]&&!vis[x][y+2][z-2]) { vis[x][y+2][z-1]=vis[x][y+2][z-2]=true; dfs(x,y+2,z-2,4,step+1); vis[x][y+2][z-1]=vis[x][y+2][z-2]=false; } if(x+2<=n) if(!vis[x+1][y+2][z]&&!vis[x+2][y+2][z]) { vis[x+1][y+2][z]=vis[x+2][y+2][z]=true; dfs(x+2,y+2,z,3,step+1); vis[x+1][y+2][z]=vis[x+2][y+2][z]=false; } if(x-2>=1) if(!vis[x-1][y+2][z]&&!vis[x-2][y+2][z]) { vis[x-1][y+2][z]=vis[x-2][y+2][z]=true; dfs(x-2,y+2,z,6,step+1); vis[x-1][y+2][z]=vis[x-2][y+2][z]=false; } vis[x][y+1][z]=vis[x][y+2][z]=false; } if(y-1>=1) if(!vis[x][y][z]&&!vis[x][y-1][z]) { vis[x][y-1][z]=vis[x][y][z]=true; if(z+2<=q) if(!vis[x][y-1][z+1]&&!vis[x][y-1][z+2]) { vis[x][y-1][z+1]=vis[x][y-1][z+2]=true; dfs(x,y-1,z+2,1,step+1); vis[x][y-1][z+1]=vis[x][y-1][z+2]=false; } if(z-2>=1) if(!vis[x][y-1][z-1]&&!vis[x][y-1][z-2]) { vis[x][y-1][z-1]=vis[x][y-1][z-2]=true; dfs(x,y-1,z-2,4,step+1); vis[x][y-1][z-1]=vis[x][y-1][z-2]=false; } if(x+2<=n) if(!vis[x+1][y-1][z]&&!vis[x+2][y-1][z]) { vis[x+1][y-1][z]=vis[x+2][y-1][z]=true; dfs(x+2,y-1,z,3,step+1); vis[x+1][y-1][z]=vis[x+2][y-1][z]=false; } if(x-2>=1) if(!vis[x-1][y-1][z]&&!vis[x-2][y-1][z]) { vis[x-1][y-1][z]=vis[x-2][y-1][z]=true; dfs(x-2,y-1,z,6,step+1); vis[x-1][y-1][z]=vis[x-2][y-1][z]=false; } vis[x][y][z]=vis[x][y-1][z]=false; } if(y+3<=m) if(!vis[x][y+1][z]&&!vis[x][y+2][z]&&!vis[x][y+3][z]) { vis[x][y+1][z]=vis[x][y+2][z]=vis[x][y+3][z]=true; if(z+1<=q) if(!vis[x][y+3][z+1]) { vis[x][y+3][z+1]=true; dfs(x,y+3,z+1,1,step+1); vis[x][y+3][z+1]=false; } if(z-1>=1) if(!vis[x][y+3][z-1]) { vis[x][y+3][z-1]=true; dfs(x,y+3,z-1,4,step+1); vis[x][y+3][z-1]=false; } if(x+1<=n) if(!vis[x+1][y+3][z]) { vis[x+1][y+3][z]=true; dfs(x+1,y+3,z,3,step+1); vis[x+1][y+3][z]=false; } if(x-1>=1) if(!vis[x-1][y+3][z]) { vis[x-1][y+3][z]=true; dfs(x-1,y+3,z,6,step+1); vis[x-1][y+3][z]=false; } vis[x][y+3][z]=vis[x][y+1][z]=vis[x][y+2][z]=false; } if(y-2>=1) if(!vis[x][y-1][z]&&!vis[x][y-2][z]&&!vis[x][y][z]) { vis[x][y-1][z]=vis[x][y-2][z]=vis[x][y][z]=true; if(z+1<=q) if(!vis[x][y-2][z+1]) { vis[x][y-2][z+1]=true; dfs(x,y-2,z+1,1,step+1); vis[x][y-2][z+1]=false; } if(z-1>=1) if(!vis[x][y-2][z-1]) { vis[x][y-2][z-1]=true; dfs(x,y-2,z-1,4,step+1); vis[x][y-2][z-1]=false; } if(x+1<=n) if(!vis[x+1][y-2][z]) { vis[x+1][y-2][z]=true; dfs(x+1,y-2,z,3,step+1); vis[x+1][y-2][z]=false; } if(x-1>=1) if(!vis[x-1][y-2][z]) { vis[x-1][y-2][z]=true; dfs(x-1,y-2,z,6,step+1); vis[x-1][y-2][z]=false; } vis[x][y-1][z]=vis[x][y-2][z]=vis[x][y][z]=false; } } if(d==6) { if(x+1<=n) if(!vis[x][y][z]&&!vis[x+1][y][z]) { vis[x][y][z]=vis[x+1][y][z]=true; if(z+2<=q) if(!vis[x+1][y][z+1]&&!vis[x+1][y][z+2]) { vis[x+1][y][z+1]=vis[x+1][y][z+2]=true; dfs(x+1,y,z+2,1,step+1); vis[x+1][y][z+1]=vis[x+1][y][z+2]=false; } if(z-2>=1) if(!vis[x+1][y][z-1]&&!vis[x+1][y][z-2]) { vis[x+1][y][z-1]=vis[x+1][y][z-2]=true; dfs(x+1,y,z-2,4,step+1); vis[x+1][y][z-1]=vis[x+1][y][z-2]=false; } if(y+2<=m) if(!vis[x+1][y+1][z]&&!vis[x+1][y+2][z]) { vis[x+1][y+1][z]=vis[x+1][y+2][z]=true; dfs(x+1,y+2,z,5,step+1); vis[x+1][y+1][z]=vis[x+1][y+2][z]=false; } if(y-2>=1) if(!vis[x+1][y-1][z]&&!vis[x+1][y-2][z]) { vis[x+1][y-1][z]=vis[x+1][y-2][z]=true; dfs(x+1,y-2,z,2,step+1); vis[x+1][y-1][z]=vis[x+1][y-2][z]=false; } vis[x+1][y][z]=vis[x][y][z]=false; } if(x-2>=1) if(!vis[x-1][y][z]&&!vis[x-2][y][z]) { vis[x-1][y][z]=vis[x-2][y][z]=true; if(z+2<=q) if(!vis[x-2][y][z+1]&&!vis[x-2][y][z+2]) { vis[x-2][y][z+1]=vis[x-2][y][z+2]=true; dfs(x-2,y,z+2,1,step+1); vis[x-2][y][z+1]=vis[x-2][y][z+2]=false; } if(z-2>=1) if(!vis[x-2][y][z-1]&&!vis[x-2][y][z-2]) { vis[x-2][y][z-1]=vis[x-2][y][z-2]=true; dfs(x-2,y,z-2,4,step+1); vis[x-2][y][z-1]=vis[x-2][y][z-2]=false; } if(y+2<=m) if(!vis[x-2][y+1][z]&&!vis[x-2][y+2][z]) { vis[x-2][y+1][z]=vis[x-2][y+2][z]=true; dfs(x-2,y+2,z,5,step+1); vis[x-2][y+1][z]=vis[x-2][y+2][z]=false; } if(y-2>=1) if(!vis[x-2][y-1][z]&&!vis[x-2][y-2][z]) { vis[x-2][y-1][z]=vis[x-2][y-2][z]=true; dfs(x-2,y-2,z,2,step+1); vis[x-2][y-1][z]=vis[x-2][y-2][z]=false; } vis[x-2][y][z]=vis[x-1][y][z]=false; } if(x+2<=n) if(!vis[x+1][y][z]&&!vis[x+2][y][z]&&!vis[x][y][z]) { vis[x+1][y][z]=vis[x+2][y][z]=vis[x][y][z]=true; if(y+1<=m) if(!vis[x+2][y+1][z]) { vis[x+2][y+1][z]=true; dfs(x+2,y+1,z,5,step+1); vis[x+2][y+1][z]=false; } if(y-1>=1) if(!vis[x+2][y-1][z]) { vis[x+2][y-1][z]=true; dfs(x+2,y-1,z,2,step+1); vis[x+2][y-1][z]=false; } if(z+1<=q) if(!vis[x+2][y][z+1]) { vis[x+2][y][z+1]=true; dfs(x+2,y,z+1,1,step+1); vis[x+2][y][z+1]=false; } if(z-1>=1) if(!vis[x+2][y][z-1]) { vis[x+2][y][z-1]=true; dfs(x+2,y,z-1,4,step+1); vis[x+2][y][z-1]=false; } vis[x+1][y][z]=vis[x+2][y][z]=vis[x][y][z]=false; } if(x-3>=1) if(!vis[x-3][y][z]&&!vis[x-1][y][z]&&!vis[x-2][y][z]) { vis[x-3][y][z]=vis[x-1][y][z]=vis[x-2][y][z]=true; if(y+1<=m) if(!vis[x-3][y+1][z]) { vis[x-3][y+1][z]=true; dfs(x-3,y+1,z,5,step+1); vis[x-3][y+1][z]=false; } if(y-1>=1) if(!vis[x-3][y-1][z]) { vis[x-3][y-1][z]=true; dfs(x-3,y-1,z,2,step+1); vis[x-3][y-1][z]=false; } if(z+1<=q) if(!vis[x-3][y][z+1]) { vis[x-3][y][z+1]=true; dfs(x-3,y,z+1,1,step+1); vis[x-3][y][z+1]=false; } if(z-1>=1) if(!vis[x-3][y][z-1]) { vis[x-3][y][z-1]=true; dfs(x-3,y,z-1,4,step+1); vis[x-3][y][z-1]=false; } vis[x-3][y][z]=vis[x-1][y][z]=vis[x-2][y][z]=false; } } } int main() { freopen("blessyou.in","r",stdin); freopen("blessyou.out","w",stdout); in(n),in(m),in(q),in(p); char op[4]; in(sx),in(sy),in(sz),scanf("%s",op); if(op[0]=='x') if(sx==1) sd=6; else sd=3; else if(op[0]=='y') if(sy==1) sd=2; else sd=5; else if(sz==1) sd=4; else sd=1; in(ex),in(ey),in(ez),scanf("%s",op); if(op[0]=='x') if(ex==1) ed=6; else ed=3; else if(op[0]=='y') if(ey==1) ed=2; else ed=5; else if(ez==1) ed=4; else ed=1; int tmpx,tmpy,tmpz; for(int i=1;i<=p;i++) { in(tmpx),in(tmpy),in(tmpz); vis[tmpx][tmpy][tmpz]=true; } ans=13; dfs(sx,sy,sz,sd,0); if(ans==13) cout<<"Dream Battle"; else cout<<ans; return 0; }
    #include <cstdio>
    int main (int argc, char *argv[])
    {
        freopen ("count.in", "r", stdin); freopen ("count.out", "w", stdout);
        int N; scanf ("%d", &N); int Answer = N; register int i, j;    
        for (i = 2; i <= N; ++ i) for (j = i; j <= N; j += i) ++ Answer;
        printf ("%d", Answer); fclose (stdin); fclose (stdout); return 0;
    }
    #include <cstdio>
    #include <iostream>
    #define rg register
    #define INF 2e9
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    #define Max 400
    int c[Max], s[Max][Max], f[Max][Max];
    inline void cmin (int &a, int b) { if (b < a) a = b; }
    int main (int argc, char *argv[])
    {
        freopen ("post.in", "r", stdin); freopen ("post.out", "w", stdout);
        int N, M; read (N), read (M); rg int i, j, k;
        for (i = 1; i <= N; ++ i) read (c[i]);
        for (i = 1; i <= N; ++ i)
            for (j = i + 1; j <= N; ++ j) s[i][j] = s[i][j - 1] + c[j] - c[(i + j) >> 1];
        for (i = 1; i <= N; ++ i) f[i][1] = s[1][i];
        for (i = 1; i <= N; ++ i)
            for (j = 2; j <= M; ++ j)
                for (k = 1, f[i][j] = INF; k < i; ++ k) cmin (f[i][j], f[k][j - 1] + s[k + 1][i]);
        printf ("%d", f[N][M]); fclose (stdin); fclose (stdout); return 0;
    }
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <map>
    #define rg register
    #define Max 10001
    const int Mod = 15;
    struct Int
    {
        int len, data[Max];
        void clear() { memset(this, 0, sizeof(*this)); }
        int &operator [] (int k) { return data[k]; }
        Int &operator = (int k)
        {
            clear(), len = 0;
            for (; k; k >>= 4) { ++ len, data[len] = k & Mod; }
            if (len == 0) ++len;
            return *this;
        }
        Int operator * (Int & A)
        {
            Int temp; temp.clear (); temp.len = len + A.len - 1; rg int i, j;
            for (i = 1; i <= len; ++ i)
                for (j = 1; j <= A.len; ++ j)
                {
                    temp[i + j - 1] += A[j] * data[i];
                    temp[i + j] += (temp[i + j - 1] >> 4);
                    temp[i + j - 1] &= Mod;
                }
            for (; temp[temp.len + 1]; ++ temp.len); return temp;
        }
        void print()
        {
            for (rg int i = len; i >= 1; i--) printf("%X", data[i]);
            putchar('
    ');
        }
    } temp, Answer;
    std :: map <int, bool> M; bool f[Max * 100]; int pnum, p[Max * 10];
    void Prepare(int M)
    {
        memset(f, 1, sizeof(f)); f[0] = f[1] = false;
        p[pnum = 1] = 2; rg int now, j;
        for (now = 2; now < M;)
        {
            for (j = now + now; j <= M; f[j] = false, j += now);
            for (++ now; now < M && !f[now]; ++ now);
            if (f[now]) p[++pnum] = now;
        }
    }
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    int Gcd(int a, int b) { return !b ? a : Gcd(b, a % b); }
    void work(int num)
    {
        for (rg int i = 1; i <= pnum; i++)
        {
            if (num % p[i] == 0)
                if (M[p[i]] == 0)
                    M[p[i]] = true, temp = p[i], Answer = Answer * temp;
            for (; num % p[i] == 0; num /= p[i]);
        }
        if (num != 1)
            if (M[num] == 0)
                M[num] = true, temp = num, Answer = Answer * temp;
    }
    int main (int argc, char *argv[])
    {
        freopen ("fraction.in", "r", stdin); freopen ("fraction.out", "w", stdout);
        Answer = 1; int t, a, b, d; read (t); Prepare (100000);
        for (; t; -- t)
            read (a), read (b), d = Gcd(a, b), a /= d, b /= d, work(b);
        Answer.print(); fclose (stdin); fclose (stdout); return 0;
    }
    #include <cstdio>
    #include <iostream>
    #include <queue>
    #include <cstring>
    std :: string Name = "fireworks", _I = ".in", _O = ".out";
    #define rg register
    #define flo double
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    #define Max 201009
    struct E { E *n; int v, d; } *list[Max], poor[Max << 1], *Ta = poor;
    int in[Max], dis[Max], N, M; bool is[Max]; 
    void Spfa ()
    {
        std :: queue <int> Q; E * e; rg int i, n, v; memset (dis, 127/3, sizeof dis);
        for (i = 1; i <= N; ++ i)
            if (in[i] == 1) Q.push (i), is[i] = true, dis[i] = 0;
        for (; !Q.empty (); Q.pop ())
            for (n = Q.front (), is[n] = false, e = list[n]; e; e = e->n)
                if (dis[v = e->v] > dis[n] + e->d)
                {    
                    dis[v] = dis[n] + e->d;
                    if (!is[v]) is[v] = true, Q.push (v);
                }
    }
    inline void In (int x, int y, int z) { ++ Ta, Ta->v = y, Ta->n = list[x], list[x] = Ta, Ta->d = z, ++ in[y]; }
    inline void cmax (flo &x, flo y) { if (y > x) x = y; }
    int main (int argc, char *argv[])
    {
        freopen ((Name + _I).c_str (), "r", stdin);
        freopen ((Name + _O).c_str (), "w", stdout);
        rg int i; flo s; int x, y, z; E *e; read (M), N = M + 1;
        for (i = 1; i <= M; ++ i)
            read (x), read (y), read (z), In (x, y, z), In (y, x, z);
        for (Spfa (), i = 1; i <= N; ++ i)
            for (e = list[i]; e; e = e->n)
                cmax (s, (dis[i] + dis[e->v] + e->d) / 2.0);
        printf ("%0.1lf", s); return 0;
    }
    #include <cstdio>
    #include <iostream>
    std :: string Name = "stone", _I = ".in", _O = ".out";
    #define rg register
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    #define Max 120
    #define INF 1e9
    inline void cmax (int &a, int b) { if (b > a) a = b; }
    int main (int argc, char *argv[])
    {
        freopen ((Name + _I).c_str (), "r", stdin);
        freopen ((Name + _O).c_str (), "w", stdout);
        int N, M, Mn, Mx, x, p; read (N), read (M); rg int i, j, k;
        static int h[Max], s = 0;
        for (i = 1; i <= N; ++ i)
        {
            for (j = 1, read (x), Mn = INF; j <= M - x + 1; ++ j)
            {
                   for (k = 1, Mx = 0; k <= x; ++ k)
                   cmax (Mx, h[j + k - 1]);
                if (Mx < Mn) Mn = Mx, p = j;    
            }
            for (j = 1; j <= x; ++ j) h[p + j - 1] = Mn + x;
        }
        for (i = 1; i <= N; ++ i) cmax (s, h[i]);
        printf ("%d", s); return 0;
    }
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define rg register
    #define Max 1000005
    #define INF 1e9
    std :: string Name = "piano", _I = ".in", _O = ".out";
    int N, M, a[Max], f[Max], maxn[Max];
    inline void read (int &n)
    {
        rg char c = getchar (); bool temp = false;
        for (n = 0; !isdigit (c); c = getchar ()) if (c == '-') temp = true;
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
        if (temp) n = -n;
    }
    inline int max (int a, int b) { return a > b ? a : b; }
    inline int cmax (int &a, int b) { if (b > a) a = b; }
    int main (int argc, char *argv[])
    {
        freopen ((Name + _I).c_str (), "r", stdin);
        freopen ((Name + _O).c_str (), "w", stdout);
        for (; scanf ("%d%d", &M, &N) != EOF; )
        {
            rg int i, j; int s = 0; memset (f, 0, sizeof f);
            memset (maxn, 0, sizeof maxn);
            for (i = 1; i <= N; ++ i) read (a[i]);
            for (j = 1; j <= M; ++ j)
                for (i = j, s = -INF; i <= N; ++ i)
                       f[i] = max (f[i - 1], maxn[i - 1]) + a[i], maxn[i-1]=s, cmax (s, f[i]);
            printf ("%d
    ",s); 
        }
        return 0;
    }
    /*
        T1
        对原矩阵做一遍模k意义下的二维前缀和
        求多少子矩阵的和是K的倍数
        易知若两个子矩阵和模K的余数相同,那么任取两个相减必定是k的倍数
        那么统计一下前缀和中模k相同的数的对数即可
    */
    #include <cstdio>
    #include <iostream>
    std :: string Name = "rally", _I = ".in", _O = ".out";
    #define rg register
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    #define Max 410
    typedef long long LL; LL s[Max][Max]; LL _s; int c[1000006], b[1000006];
    int main (int argc, char *argv[])
    {
        freopen ((Name + _I).c_str (), "r", stdin);
        freopen ((Name + _O).c_str (), "w", stdout);
        int N, M, K, z; read (N), read (M), read (K); rg int i, j, k;
        for (i = 1; i <= N; ++ i)
            for (j = 1; j <= M; ++ j)
                read (z), s[i][j] = (s[i - 1][j] + s[i][j - 1] + z + K - s[i - 1][j - 1]) % K;
        for (i = 1; i <= N; ++ i)
            for (j = i; j <= N; ++ j)
            {
                for (k = 1, c[0] = 1; k <= M; ++ k)
                    _s += c[(b[k] = s[j][k] + K - s[i - 1][k]) %= K] ++;
                for (k = 1; k <= M; ++ k) c[b[k]] = 0;
            }
        std :: cout << _s; return 0;
    }
    #include <iostream>
    #include <cstdio>
    #define rg register
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    #define Max 100005
    int N, K, s;
    struct E { E *n; int v; } *list[Max], pool[Max << 1], *Ta = pool;
    inline void In (int u, int v)
    { ++ Ta, Ta->v = v, Ta->n = list[u], list[u] = Ta; }
    inline void cmin (int &a, int b) { if (b < a) a = b; }
    inline void cmax (int &a, int b) { if (b > a) a = b; }
    int Dfs (int n, int F)
    {
        int mx = -N, mn = N, p; bool f = false; rg E *e; int v;
        for (e = list[n]; e; e = e->n)
            if ((v = e->v) != F)
                f = true, p = Dfs (v, n), cmax (mx, p), cmin (mn, p);
        if (!f) return 1;
        else if (mx + mn < 0) return mn + 1;
        else if (mx >= K) { ++ s; return -K; }
        else if (n == 1 && mx >= 0) { ++ s; return -K; }
        else return mx + 1;
    }
    std :: string Name = "general", _I = ".in", _O = ".out";
    int main (int argc, char *argv[])
    {
        freopen ((Name + _I).c_str (), "r", stdin);
        freopen ((Name + _O).c_str (), "w", stdout);
        int T, x, y; read (N), read (K), read (T); rg int i;
        if (K == 0) return printf ("%d", N), 0;
        for (i = 1; i < N; ++ i) read (x), read (y), In (x, y), In (y, x);
        Dfs (1, 0);    if (N <= 1) s = 1; printf ("%d", s); return 0;
    }
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #include <iostream>
    #define Max 40005
    #define INF 1e8
    
    namespace Z 
    {
        void read (int &now)
        {
            now = 0;
            register char word = getchar ();
            while (word < '0' || word > '9')
                word = getchar ();
            while (word >= '0' && word <= '9')
            {
                now = now * 10 + word - '0';
                word = getchar ();
            }
        }
        
        inline int min (const int &_Qos_swc, const int &_Cos_ses)
        {
            return _Qos_swc < _Cos_ses ? _Qos_swc : _Cos_ses;
        }
    }
    
    int S, T = 45;
    int M, N, K;
    int key[Max];
    int size[Max], _r[Max];
    int Answer;
    int Count;
    
    int date[Max];
    int number[Max];
    
    int cost[Max / 100][Max / 100];
    
    bool visit[Max];
    int dis[Max];
    
    void Bfs (int res)
    {
        memset (visit, false, sizeof (visit));
        std :: queue <int> Queue;
        visit[res] = true;
        dis[res] = 0;
        Queue.push (res);
        int now;
        while (!Queue.empty ())
        {
            now = Queue.front ();
            Queue.pop ();
            for (int i = 1; i <= M; i++)
            {
                if (now + size[i] <= N && (!visit[size[i] + now]))
                {
                    visit[size[i] + now] = true;
                    dis[now + size[i]] = dis[now] + 1;
                    Queue.push (now + size[i]);
                }
                if (now - size[i] >= 0 && (!visit[now - size[i]]))
                {
                    visit[now - size[i]] = true;
                    dis[now - size[i]] = dis[now] + 1;
                    Queue.push (now - size[i]);
                }
            }
        }
    }
    
    class Net_Flow_Type
    {
        private : 
        
            struct Edge_Date
            {
                int from;
                int to;
                int flow;
                int next;
                int cost;
            }
            edge[Max << 2];
            
            int Edge_Count;
            int edge_list[Max];
            int deep[Max];
            int pre[Max];
            
        public :
            
            void Prepare ()
            {
                Edge_Count = 1;
            }
            
            inline void AddEdge (int from, int to, int flow, int cost)
            {
                Edge_Count++;
                edge[Edge_Count].from = from;
                edge[Edge_Count].to = to;
                edge[Edge_Count].flow = flow;
                edge[Edge_Count].cost = cost;
                edge[Edge_Count].next = edge_list[from];
                edge_list[from] = Edge_Count;
                Edge_Count++;
                edge[Edge_Count].from = to;
                edge[Edge_Count].to = from;
                edge[Edge_Count].flow = 0;
                edge[Edge_Count].cost = -cost;
                edge[Edge_Count].next = edge_list[to];
                edge_list[to] = Edge_Count;
            }
            
            bool Spfa ()
            {
                for (int i = 0; i <= T; i++)
                    deep[i] = INF;
                std :: queue <int> Queue;
                memset (visit, false, sizeof visit);
                Queue.push (S);
                deep[S] = 0;
                visit[S] = true;
                int now;
                while (!Queue.empty ())
                {
                    now = Queue.front ();
                    Queue.pop ();
                    for (int i = edge_list[now]; i; i = edge[i].next)
                        if (edge[i].flow && deep[now] + edge[i].cost < deep[edge[i].to])
                        {
                            deep[edge[i].to] = deep[now] + edge[i].cost;
                            pre[edge[i].to] = i;
                            if (!visit[edge[i].to])
                            {
                                visit[edge[i].to] = true;
                                Queue.push (edge[i].to);
                            }
                        }
                    visit[now] = false;
                }
                return deep[T] < INF;
            }
            
            void Dinic ()
            {
                while (Spfa ())
                {
                    int res = INF;
                    for (int i = pre[T]; i; i = pre[edge[i].from])
                        res = Z :: min (res, edge[i].flow);
                    for (int i = pre[T]; i; i = pre[edge[i].from])
                    {
                        edge[i].flow -= res;
                        edge[i ^ 1].flow += res;
                        Answer += edge[i].cost * res;
                    }
                }
            }
            
            void Insert_Edges ()
            {
                for (int i = 1; i <= Count; i++)
                {
                    AddEdge (S, i, 1, 0);
                    AddEdge (i + Count, T, 1, 0); 
                }
                for (int i = 1; i <= Count; i++)
                    for (int j = 1; j <= Count; j++)
                        if (i != j && cost[i][j] != INF)
                            AddEdge (i, j + Count, 1, cost[i][j]);
            }
        
    };
    
    
    Net_Flow_Type Make;
    std :: string Name = "starlit", _I = ".in", _O = ".out";
    int main (int argc, char *argv[])
    {
        freopen ((Name + _I).c_str (), "r", stdin);
        freopen ((Name + _O).c_str (), "w", stdout);
        Z :: read (N); Z :: read (K); Z :: read (M);
        Make.Prepare (); int x;
        for (int i = 1; i <= K; i++) Z :: read (x), date[x] = true;
        for (int i = 1; i <= M; i++) Z :: read (size[i]);
        for (int i = 0; i <= N; i++)
            if (date[i] != date[i + 1]) number[i] = ++Count;
        for (int i = 0; i <= N; i++)
            if (date[i] != date[i + 1])
            {
                Bfs (i);
                for (int j = 0; j <= N; j++)
                {
                    if (!number[j])
                        continue;
                    if (!visit[j])
                        cost[number[i]][number[j]] = INF;
                    else
                        cost[number[i]][number[j]] = dis[j];
                }
            }
        Make.Insert_Edges (); 
        Make.Dinic ();
        printf ("%d", Answer >> 1); 
        return 0;
    }
    #include <iostream>
    #include <cstdio>
    #define rg register
    #define Max 30005
    int f[Max], s[Max], d[Max];
    #undef Max
    #define Max 30000
    inline void read (int &n)
    {
        rg char c = getchar ();
        for (n = 0; !isdigit (c); c = getchar ());
        for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
    }
    int Find (register int x)
    {
        for (; x != f[x]; x = f[x]) s[f[x]] = s[x] + 1;
        return x;
    }
    std :: string Name = "cube", _I = ".in", _O = ".out";
    int main (int argc, char *argv[])
    {
        freopen ((Name + _I).c_str (), "r", stdin);
        freopen ((Name + _O).c_str (), "w", stdout);
        int N, x, y, z; read (N); rg int i; char t[10];
        for (i = 1; i <= Max; ++ i) f[i] = d[i] = i;
        for (; N; -- N)
        {
            scanf ("%s", t), read (x);
            if (t[0] == 'M')
            {
                read (y), z = d[y];
                x = d[Find (x)], y = Find (y); f[y] = x;
                for (; x != f[x]; x = f[x]) d[x] = z;
                d[x] = z; Find (z);
            }
            else printf ("%d
    ", s[x]);
        }
        return 0;
    }
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #define INF 1e8
    #define Max 50010
    char l[Max];
    #define rg register
    int _n[Max], _l[Max], N, S;
    int rex[Max], rey[Max], rexn[Max], reyl[Max], t, T;
    int Erase (int i)
    {
        int res = 0;
        for (int x, c, cl, cr, n, y, r; i != 0 && i != T && (l[_l[i]] == l[i] || l[_n[i]] == l[i]); )
        {
            c = l[i]; cl = cr = 0;
            for (x = i; l[x] == c; ++ cl, x = _l[x]); -- cl;
            for (y = i; l[y] == c; ++ cr, y = _n[y]); -- cr;
            if (cl + cr >= 2)
            {
                if (x == 0) S = y;
                rex[++ t] = x, rey[t] = y, rexn[t] = _n[x], reyl[t] = _l[y], i = x, _n[x] = y, _l[y] = x, res += cl + cr + 1;
            }
            else break;
        }
        return res;
    }
    int C, Answer = INF;
    void Dfs (int Len, int s)
    {
        if (s >= Answer) return ; 
        if (Len <= 0) { Answer = s; return ; }
        int C0 = 0, C1 = 1, x, y, z, rs; rg int i;
        for (i = S; i != T; i = _n[i])
        {
            if (l[i] == l[_n[i]]) 
            {
                x = _n[_n[i]], y = _l[_n[_n[i]]]; rs = S;
                _n[_n[i]] = ++ C, _l[x] = C, l[C] = l[i]; _l[C] = _n[i], _n[C] = x;
                Dfs (Len - Erase (C), s + 1); S = rs;
                for (; t; -- t) _n[rex[t]] = rexn[t], _l[rey[t]] = reyl[t];
                _n[_n[i]] = x, _l[_n[_n[i]]] = y; -- C;
            }
        }
    }
    std :: string Name = "zuma", _I = ".in", _O = ".out";
    int main (int argc, char *argv[])
    {
        freopen ((Name + _I).c_str (), "r", stdin);
        freopen ((Name + _O).c_str (), "w", stdout);
        scanf ("%s", l + 1); N = strlen (l + 1); rg int i, j; int C1 = 0, C0 = 0;
        for (i = 1; i <= N; ++ i) _l[i] = i - 1, _n[i] = i + 1; _n[N] = -1; S = 1, T = -1; C = N;
        Dfs (N, 0); printf ("%d", Answer); return 0;
    }
  • 相关阅读:
    Java并发编程:Lock
    java多线程中的生产者与消费者之等待唤醒机制@Version2.0
    java多线程中的生产者与消费者之等待唤醒机制@Version1.0
    vim 自动补全
    git 忽略文件的三种方式
    vim 查找整个工程
    vim 寄存器的使用
    我的vim插件列表
    web前端面试系列 一 js闭包
    web前端面试系列
  • 原文地址:https://www.cnblogs.com/ZlycerQan/p/7162614.html
Copyright © 2020-2023  润新知