Submission #18976077


Source Code Expand

# included from snippets/main.py

def debug(*x, msg=""):
    import sys
    print(msg, *x, file=sys.stderr)


def solve(D, L, N, CS, KFTS):
    import bisect
    MAX_C = 10 ** 5
    first = [None] * MAX_C
    prev = [None] * MAX_C
    next = [None] * D
    occur = [[] for _i in range(MAX_C)]
    for i, d in enumerate(CS):
        d -= 1  # to 0-origin
        occur[d].append(i)
        if first[d] is None:
            first[d] = i
            prev[d] = i
        else:
            next[prev[d]] = i
            prev[d] = i
    for d in range(MAX_C):
        if prev[d] is not None:
            next[prev[d]] = D + first[d]
            occur[d].append(D + first[d])

    ups = [0] * D
    for i in range(D):
        n = next[i]
        d = n - i
        if d < 0:
            d += D
        up = (d - 1) // L + 1
        ups[i] = up

    # doubling
    db_next = [next]
    db_ups = [ups]
    for _i in range(1, 30):
        next = db_next[-1]
        ups = db_ups[-1]
        new_next = []
        new_ups = []
        for i in range(D):
            n1 = next[i] % D
            n2 = next[n1]
            u1 = ups[i]
            u2 = ups[n1]
            new_next.append(n2)
            new_ups.append(u1 + u2)
        db_next.append(new_next)
        db_ups.append(new_ups)

    for K, F, T in KFTS:
        F -= 1  # 1-origin to 0-origin
        if first[K - 1] is None:
            print(0)
            continue
        ret = 0
        countdown = T - 1
        cur = F
        prev = cur

        # find first occurence
        i = bisect.bisect_left(occur[K - 1], F)
        oc = occur[K - 1][i]
        up = (oc - cur - 1) // L + 1
        if up > countdown:
            print(0)
            continue
        countdown -= up
        ret += 1
        cur = oc % D
        # doubling binary search
        for i in range(30 - 1, -1, -1):
            up = db_ups[i][cur % D]
            if countdown >= up:
                countdown -= up
                cur = db_next[i][cur % D]
                ret += 2 ** i

        print(ret)


def main():
    # parse input
    D, L, N = map(int, input().split())
    CS = list(map(int, input().split()))
    KFTS = []
    for _i in range(N):
        KFTS.append(tuple(map(int, input().split())))
    solve(D, L, N, CS, KFTS)


# tests
T1 = """
4 2 3
2 3 1 3
1 2 2
3 3 1
3 4 3
"""
TEST_T1 = """
>>> as_input(T1)
>>> main()
1
0
3
"""

T2 = """
3 1 3
1 1 1
2 1 3
1 2 3
1 3 3
"""
TEST_T2 = """
>>> as_input(T2)
>>> main()
0
3
3
"""

T3 = """
10 4 4
4 4 4 3 1 1 5 2 2 1
2 5 2
2 9 10
2 3 3
2 7 13
"""
TEST_T3 = """
>>> as_input(T3)
>>> main()
1
5
1
6
"""


def _test():
    import doctest
    doctest.testmod()
    g = globals()
    for k in sorted(g):
        if k.startswith("TEST_"):
            print(k)
            doctest.run_docstring_examples(g[k], g, name=k)


def as_input(s):
    "use in test, use given string as input file"
    import io
    f = io.StringIO(s.strip())
    g = globals()
    g["input"] = lambda: bytes(f.readline(), "ascii")
    g["read"] = lambda: bytes(f.read(), "ascii")


if __name__ == "__main__":
    import sys
    input = sys.stdin.buffer.readline
    read = sys.stdin.buffer.read
    sys.setrecursionlimit(10 ** 6)
    if sys.argv[-1] == "-t":
        print("testing")
        _test()
        sys.exit()
    main()
    sys.exit()

# end of snippets/main.py

Submission Info

Submission Time
Task M - Cafeteria
User nishiohirokazu
Language PyPy3 (7.3.0)
Score 6
Code Size 3512 Byte
Status AC
Exec Time 702 ms
Memory 171748 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 6 / 6
Status
AC × 3
AC × 31
Set Name Test Cases
Sample s1.txt, s2.txt, s3.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, s1.txt, s2.txt, s3.txt
Case Name Status Exec Time Memory
01.txt AC 109 ms 76320 KiB
02.txt AC 98 ms 79856 KiB
03.txt AC 72 ms 76288 KiB
04.txt AC 70 ms 75712 KiB
05.txt AC 72 ms 75704 KiB
06.txt AC 77 ms 76188 KiB
07.txt AC 73 ms 76020 KiB
08.txt AC 76 ms 75980 KiB
09.txt AC 98 ms 79916 KiB
10.txt AC 81 ms 79844 KiB
11.txt AC 66 ms 75036 KiB
12.txt AC 145 ms 86592 KiB
13.txt AC 321 ms 122548 KiB
14.txt AC 379 ms 115208 KiB
15.txt AC 172 ms 91680 KiB
16.txt AC 214 ms 88632 KiB
17.txt AC 127 ms 84432 KiB
18.txt AC 510 ms 124260 KiB
19.txt AC 702 ms 171748 KiB
20.txt AC 365 ms 123332 KiB
21.txt AC 123 ms 81864 KiB
22.txt AC 607 ms 138016 KiB
23.txt AC 387 ms 95348 KiB
24.txt AC 383 ms 94556 KiB
25.txt AC 545 ms 123560 KiB
26.txt AC 651 ms 149324 KiB
27.txt AC 167 ms 84636 KiB
28.txt AC 532 ms 127348 KiB
s1.txt AC 65 ms 74920 KiB
s2.txt AC 63 ms 75168 KiB
s3.txt AC 66 ms 74784 KiB