Range Reconstruction

#include <vector>
#include <iostream>
#include <limits.h>

int main()
{
	int n;
	std::cin >> n;
	std::vector < std::vector< int >> ranges (n, std::vector<int>(n));

	for (int i = 0; i < n; i++)
	{
		for (int j = i; j < n; j++)
		{
			std::cin >> ranges[i][j-i];
		}
	}

	std::vector<int> orig(n);
	for (int i = n - 2; i >= 0; i--)
	{
		orig[i] = orig[i+1] + ranges[i][1];
		int max = (-2147483647 - 1);
		int min = 2147483647;
		bool valid = true;
		for (int j = i; j < n; j++)
		{
			max = std::max(max, orig[j]);
			min = std::min(min, orig[j]);
			if (max - min != ranges[i][j-i])
			{
				valid = false;
			}
		}

		if (!valid)
		{
			orig[i] = orig[i + 1] - ranges[i][1];
		}
	}
	for (int i = 0; i < n; i++)
	{
		if (i != n - 1)
			std::cout << orig[i] << " ";
		else
			std::cout << orig[i];
	}
}

Last updated