void Calc() { string[] str = Console.ReadLine().Split(' '); int N = int.Parse(str[0]) + 1; int Q = int.Parse(str[1]); int A = int.Parse(str[2]); int B = int.Parse(str[3]); str = Console.ReadLine().Split(' '); SegTree SegM = new SegTree(N, this); SegTree SegP = new SegTree(N, this); { int q0 = int.Parse(str[0]); for (int i = 2 * N - 2; i >= 0; i--) { if (i >= SegM.segf) { if (SegM.ToPoint(i) == A) { SegM.X[i] = Math.Max(q0 - B, B - q0) - SegM.ToPoint(i); } else if (SegM.ToPoint(i) == B) { SegM.X[i] = Math.Max(q0 - A, A - q0) - SegM.ToPoint(i); } else { SegM.X[i] = Define.INF; } } else { int sl = i * 2 + 1; int sr = i * 2 + 2; SegM.X[i] = Math.Min(SegM.X[sl], SegM.X[sr]); } } for (int i = 2 * N - 2; i >= 0; i--) { if (i >= SegP.segf) { if (SegP.ToPoint(i) == A) { SegP.X[i] = Math.Max(q0 - B, B - q0) + SegP.ToPoint(i); } else if (SegM.ToPoint(i) == B) { SegP.X[i] = Math.Max(q0 - A, A - q0) + SegP.ToPoint(i); } else { SegP.X[i] = Define.INF; } } else { int sl = i * 2 + 1; int sr = i * 2 + 2; SegP.X[i] = Math.Min(SegP.X[sl], SegP.X[sr]); } } } for (int i = 1; i < Q; i++) { int qb = int.Parse(str[i - 1]); int q = int.Parse(str[i]); long V = Math.Min(SegP.GetMin(q, N - 1) - q, SegM.GetMin(0, q) + q); SegP.AllAdd(Math.Max(qb - q, q - qb)); SegP.Insert(qb, V + qb); SegM.AllAdd(Math.Max(qb - q, q - qb)); SegM.Insert(qb, V - qb); } long count = Define.INF; for (int i = 0; i < N; i++) { count = Math.Min(count, SegP.X[SegP.ToLeaf(i)] - i); } count += SegP.L; sb.Append(count + "\n"); }