#include <mpi.h>
#include <vector>
#include <algorithm>
#include <iostream>
void longest_increasing_subsequence(std::vector<int>& arr, int n, int& length, int& last_element) {
length = 1;
last_element = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] < last_element) {
continue;
} else if (arr[i] == last_element) {
length++;
} else {
last_element = arr[i];
length = std::max(length, static_cast<int>(i) + 1);
}
}
}
int main(int argc, char *argv[]) {
MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (argc != 2) {
if (rank == 0) {
std::cerr << "Usage: " << argv[0] << " <input_file>" << std::endl;
}
MPI_Finalize();
return 1;
}
std::vector<int> arr;
int n, length, last_element;
if (rank == 0) {
// Read input from file
// ...
}
// Broadcast input size and array to all processes
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Bcast(&arr[0], n, MPI_INT, 0, MPI_COMM_WORLD);
// Calculate longest increasing subsequence on each process
int start = (n / size) * rank;
int end = start + (n / size);
if (rank == size - 1) {
end = n;
}
int local_length = 0, local_last_element = 0;
longest_increasing_subsequence(std::vector<int>(arr.begin() + start, arr.begin() + end), end - start, local_length, local_last_element);
// Gather all lengths and find the maximum
std::vector<int> lengths(size);
MPI_Gather(&local_length, 1, MPI_INT, &lengths[0], 1, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0) {
length = *std::max_element(lengths.begin(), lengths.end());
std::cout << "Length of longest increasing subsequence: " << length << std::endl;
}
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPG1waS5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp2b2lkIGxvbmdlc3RfaW5jcmVhc2luZ19zdWJzZXF1ZW5jZShzdGQ6OnZlY3RvcjxpbnQ+JiBhcnIsIGludCBuLCBpbnQmIGxlbmd0aCwgaW50JiBsYXN0X2VsZW1lbnQpIHsKICAgIGxlbmd0aCA9IDE7CiAgICBsYXN0X2VsZW1lbnQgPSBhcnJbMF07CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZiAoYXJyW2ldIDwgbGFzdF9lbGVtZW50KSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBpZiAoYXJyW2ldID09IGxhc3RfZWxlbWVudCkgewogICAgICAgICAgICBsZW5ndGgrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsYXN0X2VsZW1lbnQgPSBhcnJbaV07CiAgICAgICAgICAgIGxlbmd0aCA9IHN0ZDo6bWF4KGxlbmd0aCwgc3RhdGljX2Nhc3Q8aW50PihpKSArIDEpOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKCiAgICBpbnQgcmFuaywgc2l6ZTsKICAgIE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZyYW5rKTsKICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZzaXplKTsKCiAgICBpZiAoYXJnYyAhPSAyKSB7CiAgICAgICAgaWYgKHJhbmsgPT0gMCkgewogICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlVzYWdlOiAiIDw8IGFyZ3ZbMF0gPDwgIiA8aW5wdXRfZmlsZT4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICB9CiAgICAgICAgTVBJX0ZpbmFsaXplKCk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgc3RkOjp2ZWN0b3I8aW50PiBhcnI7CiAgICBpbnQgbiwgbGVuZ3RoLCBsYXN0X2VsZW1lbnQ7CgogICAgaWYgKHJhbmsgPT0gMCkgewogICAgICAgIC8vIFJlYWQgaW5wdXQgZnJvbSBmaWxlCiAgICAgICAgLy8gLi4uCiAgICB9CgogICAgLy8gQnJvYWRjYXN0IGlucHV0IHNpemUgYW5kIGFycmF5IHRvIGFsbCBwcm9jZXNzZXMKICAgIE1QSV9CY2FzdCgmbiwgMSwgTVBJX0lOVCwgMCwgTVBJX0NPTU1fV09STEQpOwogICAgTVBJX0JjYXN0KCZhcnJbMF0sIG4sIE1QSV9JTlQsIDAsIE1QSV9DT01NX1dPUkxEKTsKCiAgICAvLyBDYWxjdWxhdGUgbG9uZ2VzdCBpbmNyZWFzaW5nIHN1YnNlcXVlbmNlIG9uIGVhY2ggcHJvY2VzcwogICAgaW50IHN0YXJ0ID0gKG4gLyBzaXplKSAqIHJhbms7CiAgICBpbnQgZW5kID0gc3RhcnQgKyAobiAvIHNpemUpOwogICAgaWYgKHJhbmsgPT0gc2l6ZSAtIDEpIHsKICAgICAgICBlbmQgPSBuOwogICAgfQoKICAgIGludCBsb2NhbF9sZW5ndGggPSAwLCBsb2NhbF9sYXN0X2VsZW1lbnQgPSAwOwogICAgbG9uZ2VzdF9pbmNyZWFzaW5nX3N1YnNlcXVlbmNlKHN0ZDo6dmVjdG9yPGludD4oYXJyLmJlZ2luKCkgKyBzdGFydCwgYXJyLmJlZ2luKCkgKyBlbmQpLCBlbmQgLSBzdGFydCwgbG9jYWxfbGVuZ3RoLCBsb2NhbF9sYXN0X2VsZW1lbnQpOwoKICAgIC8vIEdhdGhlciBhbGwgbGVuZ3RocyBhbmQgZmluZCB0aGUgbWF4aW11bQogICAgc3RkOjp2ZWN0b3I8aW50PiBsZW5ndGhzKHNpemUpOwogICAgTVBJX0dhdGhlcigmbG9jYWxfbGVuZ3RoLCAxLCBNUElfSU5ULCAmbGVuZ3Roc1swXSwgMSwgTVBJX0lOVCwgMCwgTVBJX0NPTU1fV09STEQpOwoKICAgIGlmIChyYW5rID09IDApIHsKICAgICAgICBsZW5ndGggPSAqc3RkOjptYXhfZWxlbWVudChsZW5ndGhzLmJlZ2luKCksIGxlbmd0aHMuZW5kKCkpOwogICAgICAgIHN0ZDo6Y291dCA8PCAiTGVuZ3RoIG9mIGxvbmdlc3QgaW5jcmVhc2luZyBzdWJzZXF1ZW5jZTogIiA8PCBsZW5ndGggPDwgc3RkOjplbmRsOwogICAgfQoKICAgIE1QSV9GaW5hbGl6ZSgpOwogICAgcmV0dXJuIDA7Cn0=