import random

def mriezka(n, m):
    '''
    Vytvorí mriežku veľkosti n × m s hodnotami 1 a -1 podľa zadaných pravidiel.
    V každom riadku aj stĺpci sa nachádza aspoň jedna hodnota 1 a aspoň jedna hodnota -1.
    :param n: počet riadkov mriežky
    :type n: int
    :param m: počet stĺpcov mriežky
    :type m: int
    :return: vygenerovaná mriežka (zoznam zoznamov)
    :rtype: list[list[int]]
    '''
    if n < 2 or m < 2:
        print("n aj m musia byť aspoň 2")
        return

    # štart: všade +1
    A = [[1]*m for _ in range(n)]

    # -1 po uhlopriečke
    d = min(n, m)
    for i in range(d):
        A[i][i] = -1

    # koniec uhlopriečky: -1 na kraji
    if n > m:
        for i in range(d, n):
            A[i][m-1] = -1
    if m > n:
        for j in range(d, m):
            A[n-1][j] = -1

    # počty +1 v riadkoch a stĺpcoch
    r = [sum(x == 1 for x in A[i]) for i in range(n)]
    c = [sum(A[i][j] == 1 for i in range(n)) for j in range(m)]

    def moze(i, j, v):
        if A[i][j] == v:
            return False
        ri = r[i] + (v == 1) - (A[i][j] == 1)
        ci = c[j] + (v == 1) - (A[i][j] == 1)
        return 1 <= ri <= m-1 and 1 <= ci <= n-1

    # náhodné lokálne úpravy
    for _ in range(20 * n * m):
        i = random.randrange(n)
        j = random.randrange(m)
        v = random.choice([1, -1])
        if moze(i, j, v):
            if A[i][j] == 1:
                r[i] -= 1; c[j] -= 1
            if v == 1:
                r[i] += 1; c[j] += 1
            A[i][j] = v

    return A