import random

maxn = 100000
maxx = 1000000
maxv = 1000000

def gen(x1, x2, t1, t2, name):
    if type(x1) != int or type(x2) != int: raise ValueError("Bad types")
    if type(t1) != list or type(t2) != list: raise ValueError("Bad types")

    if x1 < 0 or x1 > maxx or x2 < 0 or x2 > maxx: raise ValueError("Bad values")
    if len(t1) > 0 and (t1[0] < 0 or t1[-1] > maxv): raise ValueError("Bad list value")
    if len(t2) > 0 and (t2[0] < 0 or t2[-1] > maxv): raise ValueError("Bad list value")

    if len(t1) > maxn or len(t2) > maxn: raise ValueError("Bad lengths")

    if abs(x1-x2) < 5: raise ValueError("Too close")

    for i in range(len(t1)-1):
        if t1[i] >= t1[i+1]: raise ValueError("Not sorted")
    for i in range(len(t2)-1):
        if t2[i] >= t2[i+1]: raise ValueError("Not sorted")

    for x in t1:
        if type(x) != int: raise ValueError("Bad types")
    for x in t2:
        if type(x) != int: raise ValueError("Bad types")

    out = open(name, "w")

    print(x1, x2, file=out)
    print(len(t1), *t1, file=out)
    print(len(t2), *t2, file=out)
    out.close()


def sample1(name):
    gen(0, 5, [1, 4, 5], [1, 4, 6], name)

def sample2(name):
    gen(0, 5, [1, 4, 5], [1, 4, 5], name)

def sample3(name):
    gen(2, 13, [1], [4, 7, 10], name)

def hand(name):
    gen(0, 5, [1, 4, 5], [1, 5, 6], name)

def blank(name1, name2):
    gen(0, 5, [], [], name1)
    gen(5, 0, [], [], name2)

def one(name1, name2):
    gen(0, 10, [], [1], name1)
    gen(0, 10, [1], [], name2)

def together(name):
    lst = [1]
    while len(lst) < maxn: lst.append(lst[-1]+random.randrange(1, 5))
    gen(5, 0, lst, lst, name)

def longdrive(name1, name2):
    gen(0, maxv, [1], [], name1)
    gen(maxv, 0, [1,maxv], [maxv], name2)

def touchngo(name, swp, crsh):
    x1, x2 = 0, 5

    d1, d2 = 0, 0

    l1, l2 = [], []

    t = 0
    while len(l1)+10 < maxn and len(l2)+10 < maxn:
        if d1 == 0 and d2 == 0:
            tt = t+random.randrange(1,10)
            l1.append(tt)
            l2.append(tt)
            ttt = tt + random.randrange(1,10)
            l1.append(ttt)
            t = ttt
            d1, d2 = 0, 1
            x1 += ttt-tt
            x2 += ttt-tt
        elif d1 == 0 and d2 == 1:
            tt = t+random.randrange(1,10)
            x2 += tt-t
            d2 = 0
            t = tt
        else:
            tt = t + x2-x1-5
            l1.append(tt)
            t=tt
            x1, x2 = x1+tt-t, x2 + d2*(tt-t)
            d1 = 0

    if crsh:
        if d2 == 1: l2.append(t+1)
        if d1 == 0: l1.append(t+1)

    else:
        if d2 == 0: l2.append(t+1)
        if d1 == 1: l1.append(t+1)

    if swp: gen(x2, x1, l2, l1, name)
    else: gen(x1, x2, l1, l2, name)


def rando(name):
    x1, x2 = 0, 0
    while abs(x1-x2) < 5:
        x1, x2 = random.randrange(1,500), random.randrange(1,500)

    l1 = [1]
    l2 = [1]
    while len(l1) < maxn:
        l1.append(l1[-1] + random.randrange(1, 5))
    while len(l2) < maxn:
        l2.append(l2[-1] + random.randrange(1, 5))

    gen(x1, x2, l1, l2, name)

if __name__ == "__main__":
    cno = 0

    def next_name():
        global cno

        cno += 1
        return "traffic-{0:02}.in".format(cno)

    sample1(next_name())
    sample2(next_name())
    sample3(next_name())

    hand(next_name())

    blank(next_name(), next_name())
    one(next_name(), next_name())
    together(next_name())

    longdrive(next_name(), next_name())

    touchngo(next_name(), False, False)
    touchngo(next_name(), True, False)
    touchngo(next_name(), False, True)
    touchngo(next_name(), True, True)

    for i in range(10):
        rando(next_name())
