#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <chrono>

int main() {
	std::vector<std::vector<int>> matrix;
	std::vector<std::string> safeness;
	int total = 0;
	int total2 = 0;
	std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();

	std::ifstream file("m");
	std::string line;
	while (std::getline(file, line)) {
		std::vector<int> row;  // Vector to store each row's integers
		std::stringstream ss(line);  // Stringstream to split the line into integers
		int num;
		
		// Split the line by spaces and store each number in the row vector
		while (ss >> num) {
		    row.push_back(num);
		}

		// Add the row to the 2D vector
		matrix.push_back(row);
    	}

	for (int row = 0; row < matrix.size(); row++) {
		int direction = 0; // positive for increasing, negative for decreasing
		int temp_total = 0;
		int temp_total2 = 0;
		for (int column = 0; column < matrix[row].size()-1; column++) {
			int diff = matrix[row][column]-matrix[row][column+1];
			if (diff < 0 && direction > 0) {
				temp_total += 1;
			}
			else if (diff > 0 && direction < 0)  {
				temp_total += 1;
			}
			else if (diff == 0) {
				temp_total += 1;
			}
			else if ((diff > 3) || (diff < -3)) { 
				temp_total += 1;
			}


			if ((matrix[row].size() - column+3) > 0) {
				int diff2 = matrix[row][column]-matrix[row][column+2];
				if (((diff2 < 0 && direction > 0) || (diff2 > 0 && direction < 0)) && ((diff < 0 && direction > 0) || (diff > 0 && direction < 0))) {
					temp_total2 += 1;
				}
				else if (((diff2 > 3) || (diff2 < -3) || (diff2 == 0)) && ((diff > 3) || (diff < -3) || (diff == 0))){ 
					temp_total2 += 1;
				}	
			}
			if (temp_total > 1) {
				temp_total = 1;
			};
			if (temp_total2 > 1) {
				temp_total2 = 1;
			};
			direction = diff;
		};
		total += temp_total;
		total2 += temp_total2;
	};

	total = matrix.size() - total;
	total2 = matrix.size() - total2;

	std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

	std::cout << "Part 1: " << total << "\nPart 2: " << total2 << "\n";
    std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() << " microseconds" << std::endl;	
	

	return 0;
};
