Buggy python submission (verdict: Time Limit Exceeded):
import sys


class SegTreeMin:
    """
    以下のクエリを処理する
    1.update:  i番目の値をxに更新する
    2.get_min: 区間[l, r)の最小値を得る
    """

    def __init__(self, n, INF):
        """
        :param n: 要素数
        :param INF: 初期値（入りうる要素より十分に大きな数）
        """
        n2 = 1 << (n - 1).bit_length()
        self.offset = n2
        self.tree = [INF] * (n2 << 1)
        self.INF = INF

    @classmethod
    def from_list(cls, lst, INF):
        """
        既存のリストから構築する

        :param lst:
        :param INF:
        :return:
        """
        n = len(lst)
        ins = cls(n, INF)
        ofs = ins.offset
        tree = ins.tree
        tree[ofs:ofs + n] = lst
        for i in range(ofs - 1, 0, -1):
            l = i << 1
            tree[i] = min(tree[l], tree[l + 1])
        return ins

    def update(self, i, x):
        """
        i番目の値をxに更新
        :param i: index(0-indexed)
        :param x: update value
        """
        i += self.offset
        self.tree[i] = x
        while i > 1:
            y = self.tree[i ^ 1]
            if y <= x:
                break
            i >>= 1
            self.tree[i] = x

    def get_min(self, a, b):
        """
        [a, b)の最小値を得る
        :param a: index(0-indexed)
        :param b: index(0-indexed)
        """
        result = self.INF

        l = a + self.offset
        r = b + self.offset
        while l < r:
            if r & 1:
                result = min(result, self.tree[r - 1])
            if l & 1:
                result = min(result, self.tree[l])
                l += 1
            l >>= 1
            r >>= 1

        return result


n, x, *aaa = map(int, sys.stdin.buffer.read().split())
INF = 10 ** 18
sgt = SegTreeMin.from_list(aaa + aaa, INF)
# k回魔法を使うと決め打つ → その回数で色iを入手するのに最適なのは、i-k～iのスライムの最小値
ans = INF
for k in range(n):
    ans = min(ans, sum(sgt.get_min(i - k, i + 1) for i in range(n, 2 * n)) + k * x)
print(ans)


Fixed submission:
import sys


class SegTreeMin:
    """
    以下のクエリを処理する
    1.update:  i番目の値をxに更新する
    2.get_min: 区間[l, r)の最小値を得る
    """

    def __init__(self, n, INF):
        """
        :param n: 要素数
        :param INF: 初期値（入りうる要素より十分に大きな数）
        """
        n2 = 1 << (n - 1).bit_length()
        self.offset = n2
        self.tree = [INF] * (n2 << 1)
        self.INF = INF

    @classmethod
    def from_list(cls, lst, INF):
        """
        既存のリストから構築する

        :param lst:
        :param INF:
        :return:
        """
        n = len(lst)
        ins = cls(n, INF)
        ofs = ins.offset
        tree = ins.tree
        tree[ofs:ofs + n] = lst
        for i in range(ofs - 1, 0, -1):
            l = i << 1
            tree[i] = min(tree[l], tree[l + 1])
        return ins

    def update(self, i, x):
        """
        i番目の値をxに更新
        :param i: index(0-indexed)
        :param x: update value
        """
        i += self.offset
        self.tree[i] = x
        while i > 1:
            y = self.tree[i ^ 1]
            if y <= x:
                break
            i >>= 1
            self.tree[i] = x

    def get_min(self, a, b):
        """
        [a, b)の最小値を得る
        :param a: index(0-indexed)
        :param b: index(0-indexed)
        """
        result = self.INF

        l = a + self.offset
        r = b + self.offset
        while l < r:
            if r & 1:
                result = min(result, self.tree[r - 1])
            if l & 1:
                result = min(result, self.tree[l])
                l += 1
            l >>= 1
            r >>= 1

        return result


n, x, *aaa = map(int, sys.stdin.buffer.read().split())
INF = 10 ** 18
sgt = SegTreeMin.from_list(aaa + aaa, INF)
# k回魔法を使うと決め打つ → その回数で色iを入手するのに最適なのは、i-k～iのスライムの最小値
ans = INF
for k in range(n):
    ans = min(ans, sum(sgt.get_min(i - k, i + 1) for i in range(n, 2 * n)) + k * x)
print(ans)