n, C = map(int, input().split()) a = [] b = [] for _ in range(n): ai, bi = map(int, input().split()) a.append(ai) b.append(bi) L = [0] * (n + 1) # 1-based indexing for craftsmen R = [0] * (n + 1) for k in range(1, n + 1): # Find L_k (smallest x where craftsman k can cover x) low, high = 1, k left = k while low <= high: mid = (low + high) // 2 if a[k-1] + C * (k - mid) <= a[mid-1] + b[mid-1]: left = mid high = mid - 1 else: low = mid + 1 L[k] = left # Find R_k (largest x where craftsman k can cover x) low, high = k, n right = k while low <= high: mid = (low + high) // 2 if a[k-1] + C * (mid - k) <= a[mid-1] + b[mid-1]: right = mid low = mid + 1 else: high = mid - 1 R[k] = right INF = float('inf') dp = [INF] * (n + 2) dp[0] = 0 # Update dp for individual assignments for x in range(1, n + 1): cost = b[x-1] + a[x-1] if dp[x-1] + cost < dp[x]: dp[x] = dp[x-1] + cost # Update dp for each craftsman's optimal interval for k in range(1, n + 1): l = L[k] r = R[k] if l > r: continue m = r - l + 1 sum_dist = (k - l) * (k - l + 1) // 2 + (r - k) * (r - k + 1) // 2 total_cost = b[k-1] + m * a[k-1] + C * sum_dist if l - 1 >= 0 and dp[l-1] + total_cost < dp[r]: dp[r] = dp[l-1] + total_cost print(dp[n])