Problem:
Score : 700 points

Problem Statement

Given is a sequence of N digits a_1a_2\ldots a_N, where each element is 1, 2, or 3.
Let x_{i,j} defined as follows:

x_{1,j} := a_j \quad (1 \leq j \leq N)

x_{i,j} := | x_{i-1,j} - x_{i-1,j+1} | \quad (2 \leq i \leq N and 1 \leq j \leq N+1-i)

Find x_{N,1}.

Constraints

2 \leq N \leq 10^6

a_i = 1,2,3 (1 \leq i \leq N)

Input

Input is given from Standard Input in the following format:

N
a_1a_2\ldotsa_N

Output

Print x_{N,1}.

Sample Input 1

4
1231

Sample Output 1

1

x_{1,1},x_{1,2},x_{1,3},x_{1,4} are respectively 1,2,3,1.

x_{2,1},x_{2,2},x_{2,3} are respectively |1-2| = 1,|2-3| = 1,|3-1| = 2.

x_{3,1},x_{3,2} are respectively |1-1| = 0,|1-2| = 1.

Finally, x_{4,1} = |0-1| = 1, so the answer is 1.

Sample Input 2

10
2311312312

Sample Output 2

0

Solution in Kotlin (1.0.0) (judge verdict: Wrong Answer)

import java.lang.Math

class IntSegmentTree(n: Int, private val init: Int, private val func: (Int, Int) -> Int) {
    private var size = 1

    init {
        while (size < n) {
            size *= 2
        }
    }

    private val segTree = IntArray(size * 2 - 1) { init }

    // 指定要素を更新
    fun update(x: Int, value: Int) {
        var tmp = x + size - 1

        segTree[tmp] = value
        while (tmp > 0) {
            tmp = (tmp - 1) / 2
            segTree[tmp] = func(segTree[2 * tmp + 1], segTree[2 * tmp + 2])
        }
    }

    // [a, b)の関数適用結果を取得
    // bが開区間であることに注意
    fun get(a: Int, b: Int, k: Int = 0, l: Int = 0, r: Int = size): Int {
        if (r <= a || b <= l) {
            return init
        }
        if (a <= l && r <= b) {
            return segTree[k]
        }

        val vl = get(a, b, 2 * k + 1, l, (l + r) / 2)
        val vr = get(a, b, 2 * k + 2, (l + r) / 2, r)

        return func(vl, vr)
    }

    // 指定要素を取得
    fun getElem(x: Int): Int = segTree[x + size - 1]
}

fun main(args: Array<String>) {
    val N = readInputLine().toInt()
    val a = readInputLine().toCharArray()

    val conCat = IntArray(N - 1)

    for (i in 0 until N - 1) {
        conCat[i] = Math.abs(a[i] - a[i + 1])
    }

    val segTree = IntSegmentTree(N - 1, 0) { x, y -> Math.abs(x - y) }

    segTree.update(0, conCat[0])

    for (i in 1 until N - 1) {
        val upVal = Math.abs(segTree.get(0, i - 1) - conCat[i])
        segTree.update(i, upVal)
    }

    println(segTree.get(0, N))
}

fun readInputLine(): String {
    return readLine()!!
}