#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *values; // Values to sort
int index; // Row or column index
int size; // Number of elements in the row or column
int order; // Sort order: 1 for ascending, 0 for descending
} SortTask;
int **matrix;
int rows, cols, studentIDEnd;
long totalSum = 0;
pthread_mutex_t sumMutex;
void *sortAndSum(void *arg);
void quickSort(int *arr, int low, int high, int ascending);
int partition(int *arr, int low, int high, int ascending);
void swap(int *a, int *b);
void initializeMatrix();
void displayMatrix(int **mat, int rows, int cols);
int main() {
initializeMatrix();
pthread_mutex_init(&sumMutex, NULL);
int numThreads = (studentIDEnd <= 2 || studentIDEnd == 4 || studentIDEnd == 5) ? cols : rows;
pthread_t threads[numThreads];
SortTask tasks[numThreads];
for (int i = 0; i < numThreads; i++) {
tasks[i].size = (studentIDEnd <= 2 || studentIDEnd == 4 || studentIDEnd == 5) ? rows : cols;
tasks
[i
].
values = malloc(tasks
[i
].
size * sizeof(int)); tasks[i].index = i;
tasks[i].order = (studentIDEnd == 0 || studentIDEnd == 1 || studentIDEnd == 2 || studentIDEnd == 6 || studentIDEnd == 7);
for (int j = 0; j < tasks[i].size; j++) {
tasks[i].values[j] = (studentIDEnd <= 2 || studentIDEnd == 4 || studentIDEnd == 5) ? matrix[j][i] : matrix[i][j];
}
pthread_create(&threads[i], NULL, sortAndSum, &tasks[i]);
}
for (int i = 0; i < numThreads; i++) {
pthread_join(threads[i], NULL);
for (int j = 0; j < tasks[i].size; j++) {
if (studentIDEnd <= 2 || studentIDEnd == 4 || studentIDEnd == 5) {
matrix[j][tasks[i].index] = tasks[i].values[j];
} else {
matrix[tasks[i].index][j] = tasks[i].values[j];
}
}
}
pthread_mutex_destroy(&sumMutex);
displayMatrix(matrix, rows, cols);
printf("Total sum of all elements: %ld\n", totalSum
);
for (int i = 0; i < rows; i++) {
}
return 0;
}
void initializeMatrix() {
printf("Enter dimensions of the matrix (rows x cols): "); scanf("%d %d", &rows
, &cols
); printf("Enter the last digit of your student ID: "); scanf("%d", &studentIDEnd
);
matrix
= (int**) malloc(rows
* sizeof(int*)); for (int i = 0; i < rows; i++) {
matrix
[i
] = (int*) malloc(cols
* sizeof(int)); printf("Enter %d elements for row %d: ", cols
, i
+ 1); for (int j = 0; j < cols; j++) {
scanf("%d", &matrix
[i
][j
]); }
}
displayMatrix(matrix, rows, cols);
}
void *sortAndSum(void *arg) {
SortTask *task = (SortTask *)arg;
quickSort(task->values, 0, task->size - 1, task->order);
long sum = 0;
for (int i = 0; i < task->size; i++) {
sum += task->values[i];
}
pthread_mutex_lock(&sumMutex);
totalSum += sum;
pthread_mutex_unlock(&sumMutex);
pthread_exit(NULL);
}
void quickSort(int *arr, int low, int high, int ascending) {
if (low < high) {
int pi = partition(arr, low, high, ascending);
quickSort(arr, low, pi - 1, ascending);
quickSort(arr, pi + 1, high, ascending);
}
}
int partition(int *arr, int low, int high, int ascending) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if ((ascending && arr[j] <= pivot) || (!ascending && arr[j] >= pivot)) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return i + 1;
}
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void displayMatrix(int **mat, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
}
}
}
I2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCAqdmFsdWVzOyAgLy8gVmFsdWVzIHRvIHNvcnQKICAgIGludCBpbmRleDsgICAgLy8gUm93IG9yIGNvbHVtbiBpbmRleAogICAgaW50IHNpemU7ICAgICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHJvdyBvciBjb2x1bW4KICAgIGludCBvcmRlcjsgICAgLy8gU29ydCBvcmRlcjogMSBmb3IgYXNjZW5kaW5nLCAwIGZvciBkZXNjZW5kaW5nCn0gU29ydFRhc2s7CgppbnQgKiptYXRyaXg7CmludCByb3dzLCBjb2xzLCBzdHVkZW50SURFbmQ7CmxvbmcgdG90YWxTdW0gPSAwOwpwdGhyZWFkX211dGV4X3Qgc3VtTXV0ZXg7Cgp2b2lkICpzb3J0QW5kU3VtKHZvaWQgKmFyZyk7CnZvaWQgcXVpY2tTb3J0KGludCAqYXJyLCBpbnQgbG93LCBpbnQgaGlnaCwgaW50IGFzY2VuZGluZyk7CmludCBwYXJ0aXRpb24oaW50ICphcnIsIGludCBsb3csIGludCBoaWdoLCBpbnQgYXNjZW5kaW5nKTsKdm9pZCBzd2FwKGludCAqYSwgaW50ICpiKTsKdm9pZCBpbml0aWFsaXplTWF0cml4KCk7CnZvaWQgZGlzcGxheU1hdHJpeChpbnQgKiptYXQsIGludCByb3dzLCBpbnQgY29scyk7CgppbnQgbWFpbigpIHsKICAgIGluaXRpYWxpemVNYXRyaXgoKTsKICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmc3VtTXV0ZXgsIE5VTEwpOwoKICAgIGludCBudW1UaHJlYWRzID0gKHN0dWRlbnRJREVuZCA8PSAyIHx8IHN0dWRlbnRJREVuZCA9PSA0IHx8IHN0dWRlbnRJREVuZCA9PSA1KSA/IGNvbHMgOiByb3dzOwogICAgcHRocmVhZF90IHRocmVhZHNbbnVtVGhyZWFkc107CiAgICBTb3J0VGFzayB0YXNrc1tudW1UaHJlYWRzXTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykgewogICAgICAgIHRhc2tzW2ldLnNpemUgPSAoc3R1ZGVudElERW5kIDw9IDIgfHwgc3R1ZGVudElERW5kID09IDQgfHwgc3R1ZGVudElERW5kID09IDUpID8gcm93cyA6IGNvbHM7CiAgICAgICAgdGFza3NbaV0udmFsdWVzID0gbWFsbG9jKHRhc2tzW2ldLnNpemUgKiBzaXplb2YoaW50KSk7CiAgICAgICAgdGFza3NbaV0uaW5kZXggPSBpOwogICAgICAgIHRhc2tzW2ldLm9yZGVyID0gKHN0dWRlbnRJREVuZCA9PSAwIHx8IHN0dWRlbnRJREVuZCA9PSAxIHx8IHN0dWRlbnRJREVuZCA9PSAyIHx8IHN0dWRlbnRJREVuZCA9PSA2IHx8IHN0dWRlbnRJREVuZCA9PSA3KTsKCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YXNrc1tpXS5zaXplOyBqKyspIHsKICAgICAgICAgICAgdGFza3NbaV0udmFsdWVzW2pdID0gKHN0dWRlbnRJREVuZCA8PSAyIHx8IHN0dWRlbnRJREVuZCA9PSA0IHx8IHN0dWRlbnRJREVuZCA9PSA1KSA/IG1hdHJpeFtqXVtpXSA6IG1hdHJpeFtpXVtqXTsKICAgICAgICB9CgogICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWRzW2ldLCBOVUxMLCBzb3J0QW5kU3VtLCAmdGFza3NbaV0pOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVGhyZWFkczsgaSsrKSB7CiAgICAgICAgcHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFza3NbaV0uc2l6ZTsgaisrKSB7CiAgICAgICAgICAgIGlmIChzdHVkZW50SURFbmQgPD0gMiB8fCBzdHVkZW50SURFbmQgPT0gNCB8fCBzdHVkZW50SURFbmQgPT0gNSkgewogICAgICAgICAgICAgICAgbWF0cml4W2pdW3Rhc2tzW2ldLmluZGV4XSA9IHRhc2tzW2ldLnZhbHVlc1tqXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG1hdHJpeFt0YXNrc1tpXS5pbmRleF1bal0gPSB0YXNrc1tpXS52YWx1ZXNbal07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnJlZSh0YXNrc1tpXS52YWx1ZXMpOwogICAgfQoKICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmc3VtTXV0ZXgpOwoKICAgIHByaW50ZigiU29ydGVkIG1hdHJpeDpcbiIpOwogICAgZGlzcGxheU1hdHJpeChtYXRyaXgsIHJvd3MsIGNvbHMpOwogICAgcHJpbnRmKCJUb3RhbCBzdW0gb2YgYWxsIGVsZW1lbnRzOiAlbGRcbiIsIHRvdGFsU3VtKTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIGZyZWUobWF0cml4W2ldKTsKICAgIH0KICAgIGZyZWUobWF0cml4KTsKCiAgICByZXR1cm4gMDsKfQoKdm9pZCBpbml0aWFsaXplTWF0cml4KCkgewogICAgcHJpbnRmKCJFbnRlciBkaW1lbnNpb25zIG9mIHRoZSBtYXRyaXggKHJvd3MgeCBjb2xzKTogIik7CiAgICBzY2FuZigiJWQgJWQiLCAmcm93cywgJmNvbHMpOwogICAgcHJpbnRmKCJFbnRlciB0aGUgbGFzdCBkaWdpdCBvZiB5b3VyIHN0dWRlbnQgSUQ6ICIpOwogICAgc2NhbmYoIiVkIiwgJnN0dWRlbnRJREVuZCk7CgogICAgbWF0cml4ID0gKGludCoqKSBtYWxsb2Mocm93cyAqIHNpemVvZihpbnQqKSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3M7IGkrKykgewogICAgICAgIG1hdHJpeFtpXSA9IChpbnQqKSBtYWxsb2MoY29scyAqIHNpemVvZihpbnQpKTsKICAgICAgICBwcmludGYoIkVudGVyICVkIGVsZW1lbnRzIGZvciByb3cgJWQ6ICIsIGNvbHMsIGkgKyAxKTsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBzY2FuZigiJWQiLCAmbWF0cml4W2ldW2pdKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpbnRmKCJJbml0aWFsIG1hdHJpeDpcbiIpOwogICAgZGlzcGxheU1hdHJpeChtYXRyaXgsIHJvd3MsIGNvbHMpOwp9Cgp2b2lkICpzb3J0QW5kU3VtKHZvaWQgKmFyZykgewogICAgU29ydFRhc2sgKnRhc2sgPSAoU29ydFRhc2sgKilhcmc7CiAgICBxdWlja1NvcnQodGFzay0+dmFsdWVzLCAwLCB0YXNrLT5zaXplIC0gMSwgdGFzay0+b3JkZXIpOwoKICAgIGxvbmcgc3VtID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFzay0+c2l6ZTsgaSsrKSB7CiAgICAgICAgc3VtICs9IHRhc2stPnZhbHVlc1tpXTsKICAgIH0KCiAgICBwdGhyZWFkX211dGV4X2xvY2soJnN1bU11dGV4KTsKICAgIHRvdGFsU3VtICs9IHN1bTsKICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzdW1NdXRleCk7CiAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Cn0KCnZvaWQgcXVpY2tTb3J0KGludCAqYXJyLCBpbnQgbG93LCBpbnQgaGlnaCwgaW50IGFzY2VuZGluZykgewogICAgaWYgKGxvdyA8IGhpZ2gpIHsKICAgICAgICBpbnQgcGkgPSBwYXJ0aXRpb24oYXJyLCBsb3csIGhpZ2gsIGFzY2VuZGluZyk7CiAgICAgICAgcXVpY2tTb3J0KGFyciwgbG93LCBwaSAtIDEsIGFzY2VuZGluZyk7CiAgICAgICAgcXVpY2tTb3J0KGFyciwgcGkgKyAxLCBoaWdoLCBhc2NlbmRpbmcpOwogICAgfQp9CgppbnQgcGFydGl0aW9uKGludCAqYXJyLCBpbnQgbG93LCBpbnQgaGlnaCwgaW50IGFzY2VuZGluZykgewogICAgaW50IHBpdm90ID0gYXJyW2hpZ2hdOwogICAgaW50IGkgPSBsb3cgLSAxOwogICAgZm9yIChpbnQgaiA9IGxvdzsgaiA8IGhpZ2g7IGorKykgewogICAgICAgIGlmICgoYXNjZW5kaW5nICYmIGFycltqXSA8PSBwaXZvdCkgfHwgKCFhc2NlbmRpbmcgJiYgYXJyW2pdID49IHBpdm90KSkgewogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIHN3YXAoJmFycltpXSwgJmFycltqXSk7CiAgICAgICAgfQogICAgfQogICAgc3dhcCgmYXJyW2kgKyAxXSwgJmFycltoaWdoXSk7CiAgICByZXR1cm4gaSArIDE7Cn0KCnZvaWQgc3dhcChpbnQgKmEsIGludCAqYikgewogICAgaW50IHRlbXAgPSAqYTsKICAgICphID0gKmI7CiAgICAqYiA9IHRlbXA7Cn0KCnZvaWQgZGlzcGxheU1hdHJpeChpbnQgKiptYXQsIGludCByb3dzLCBpbnQgY29scykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvbHM7IGorKykgewogICAgICAgICAgICBwcmludGYoIiUyZCAiLCBtYXRbaV1bal0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9Cn0K