#include <stdio.h>
#include <pthread.h>

#define THREAD_COUNT 4
#define N 10000000LL

long long partial[THREAD_COUNT];

void *add_block(void *argument) {
    long id = *(long *)argument;
    long long block_size = N / THREAD_COUNT;
    long long first = id * block_size + 1;
    long long last = (id + 1) * block_size;
    long long local_sum = 0;

    for (long long i = first; i <= last; i++) {
        local_sum += i;
    }
    partial[id] = local_sum;
    return NULL;
}

int main(void) {
    pthread_t workers[THREAD_COUNT];
    long ids[THREAD_COUNT];

    for (long t = 0; t < THREAD_COUNT; t++) {
        ids[t] = t;
        pthread_create(&workers[t], NULL, add_block, &ids[t]);
    }

    long long total = 0;
    for (int t = 0; t < THREAD_COUNT; t++) {
        pthread_join(workers[t], NULL);
        printf("Worker %d partial sum: %lld\n", t, partial[t]);
        total += partial[t];
    }
    printf("Sum from 1 through %lld: %lld\n", N, total);
    return 0;
}
