Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdbool.h>
- /*DEBUG*/
- enum
- {
- MAX_LEN_PATH = FILENAME_MAX + 2,
- MAX_OPEN_FILES = 100,
- MAX_NUM_FROM_FILES = 4
- };
- int mas[MAX_OPEN_FILES][10000], sz[MAX_OPEN_FILES];
- void
- my_func(char path[MAX_OPEN_FILES][MAX_LEN_PATH], int num)
- {
- FILE *out = stdout;
- FILE *in = NULL;
- printf("FUNC\n");
- int i, j, pos[MAX_OPEN_FILES], sz[MAX_OPEN_FILES];
- for(i = 0; i < num; ++i) {
- in = fopen(path[i], "r");
- sz[i] = 0;
- while(fscanf(in, "%d", &mas[i][sz[i]]) == 1) {
- ++sz[i];
- }
- fclose(in);
- }
- for(i = 0; i < num; ++i) {
- pos[i] = 0;
- }
- bool flag;
- for(i = 0; i < sz[0]; ++i) {
- flag = true;
- for(j = 1; j < num; ++j) {
- while(pos[j] < sz[j] && mas[j][pos[j]] > mas[0][i]) {
- ++pos[j];
- }
- if(pos[j] == sz[j] || mas[j][pos[j]] != mas[0][i]) {
- flag = false;
- break;
- }
- }
- if(flag) {
- fprintf(out, "%d ", mas[0][i]);
- }
- }
- fprintf(out, "\n");
- }
- #include <stdlib.h>
- #include <time.h>
- void
- my_gen(int num, int N)
- {
- FILE *in = fopen("input.txt", "w");
- FILE *ff = NULL;
- char path[100], number[100];
- int i, j, c;
- srand(time(NULL));
- for(i=0; i<num; ++i)
- {
- path[0] = 'i';
- path[1] = 'n';
- path[2] = i/10 + '0';
- path[3] = i%10 + '0';
- path[4] = 0;
- strcat(path, ".txt");
- fprintf(in, "%s\n", path);
- ff = fopen(path, "w");
- c = rand()%10;
- for(j = 0; j < N; ++j) {
- fprintf(ff, "%d ", c);
- c -= rand()%2 + 1;
- }
- fclose(ff);
- }
- fclose(in);
- }
- int
- get_min(int *date, int *tr, int l, int r)
- {
- int ans = tr[l];
- for(; l <= r; l >>= 1, r >>= 1) {
- if(l & 1) {
- if(date[ans] > date[tr[l]]) {
- ans = tr[l];
- }
- ++l;
- }
- if(!(r & 1)) {
- if(date[ans] > date[tr[r]]) {
- ans = tr[r];
- }
- --r;
- }
- }
- return ans;
- }
- void
- change_min(int *date, int *tr, int i)
- {
- int op1, op2;
- for(i >>= 1; i; i >>= 1) {
- op1 = tr[(i << 1)];
- op2 = tr[(i << 1) + 1];
- if(date[op1] < date[op2]) {
- tr[i] = op1;
- } else {
- tr[i] = op2;
- }
- }
- }
- int
- get_max(int *date, int *tr, int l, int r)
- {
- int ans = tr[l];
- for(; l <= r; l >>= 1, r >>= 1) {
- if(l & 1) {
- if(date[ans] < date[tr[l]]) {
- ans = tr[l];
- }
- ++l;
- }
- if(!(r & 1)) {
- if(date[ans] < date[tr[r]]) {
- ans = tr[r];
- }
- --r;
- }
- }
- return ans;
- }
- void
- change_max(int *date, int *tr, int i)
- {
- int op1, op2;
- for(i >>= 1; i > 0; i >>= 1) {
- op1 = tr[(i << 1)];
- op2 = tr[(i << 1) + 1];
- if(date[op1] > date[op2]) {
- tr[i] = op1;
- } else {
- tr[i] = op2;
- }
- }
- }
- int
- main(void)
- {
- freopen("input.txt", "r", stdin);
- //my_gen(100, 1000);
- //return 0;
- enum
- {
- MAX_LEN_PATH = FILENAME_MAX + 2,
- MAX_OPEN_FILES = 100,
- MAX_NUM_FROM_FILES = 4
- };
- int i, j;
- char path[MAX_OPEN_FILES][MAX_LEN_PATH];
- int len, num = 0;
- fgets(path[num], MAX_LEN_PATH, stdin);
- while(!feof(stdin)) {
- len = strlen(path[num]);
- if(len && path[num][len-1] == '\n') {
- path[num][--len] = 0;
- }
- if(len && path[num][len-1] == '\r') {
- path[num][--len] = 0;
- }
- if(len) {
- ++num;
- }
- fgets(path[num], MAX_LEN_PATH, stdin);
- }
- long pos[MAX_OPEN_FILES];
- int date[MAX_OPEN_FILES];
- int tr_mn[1000], tr_mx[1000], sz = 128;
- for(i = 0; i < num; ++i) {
- tr_mn[i + sz] = tr_mx[i + sz] = i;
- }
- for(i = num; i < sz; ++i) {
- tr_mn[i + sz] = tr_mx[i + sz] = num-1;
- }
- for(i=0; i<num; ++i) {
- pos[i] = 0;
- }
- printf("num=%d\n", num);
- FILE *in = NULL;
- int fli = 0;
- for(i = 0; i < num; ++i) {
- in = fopen(path[i], "r");
- if(fscanf(in, "%d", &date[i]) <= 0) {
- fclose(in);
- printf("\n");
- return 0;
- }
- pos[i] = ftell(in);
- fclose(in);
- }
- for(i = 0; i < num; ++i) {
- change_max(date, tr_mx, i+sz);
- change_min(date, tr_mn, i+sz);
- }
- // my_func(path, num);
- int mn, mx;
- while(1) {
- mn = mx = 0;
- /*for(i = 1; i < num; ++i) {
- if(date[i] > date[mx]) {
- mx = i;
- }
- if(date[i] < date[mn]) {
- mn = i;
- }
- }*/
- mn = get_min(date, tr_mn, sz, sz+num-1);
- mx = get_max(date, tr_mx, sz, sz+num-1);
- //printf("\n");
- // printf("%d %d\n", date[mn], date[tr_mn[1]]);
- /*if( date[mn] != date[get_min(date, tr_mn, sz, sz+num-1)] ) {
- printf("BAD1\n");
- }
- if( date[mx] != date[get_max(date, tr_mx, sz, sz+num-1)] ) {
- printf("BAD2\n");
- printf("%d %d\n", date[mx], date[tr_mx[1]]);
- printf("mx=%d %d\n", mx, tr_mx[1]);
- for(i=0; i<num; ++i) {
- printf("%d ", date[i]);
- }
- for(i = 0; i < num; ++i) {
- change_max(date, tr_mx, i+sz);
- change_min(date, tr_mn, i+sz);
- }
- printf("\n%d %d\n", date[mx] , date[tr_mx[1]]);
- return 0;
- }*/
- //return 0;
- //mx = tr_mx[1];
- //mn = get_min(date, tr_mn, sz, 2*sz-1);
- // mn = get_min(date, tr_mn, sz, 2*sz-1);
- //mx = get_max(date, tr_mx, sz, 2*sz-1);
- //printf("%d %d\n", mn, mx);
- if(date[mn] == date[mx]) {
- //printf("%d ", date[0]);
- for(i = 0; i < num; ++i) {
- in = fopen(path[i], "r");
- fseek(in, pos[i], SEEK_SET);
- if(fscanf(in, "%d", &date[i]) <= 0) {
- fclose(in);
- printf("\n");
- return 0;
- }
- pos[i] = ftell(in);
- fclose(in);
- }
- for(i = 0; i < num; ++i) {
- change_max(date, tr_mx, i+sz);
- change_min(date, tr_mn, i+sz);
- }
- } else {
- in = fopen(path[mx], "r");
- fseek(in, pos[mx], SEEK_SET);
- if(fscanf(in, "%d", &date[mx]) <= 0) {
- fclose(in);
- break;
- }
- change_max(date, tr_mx, mx+sz);
- change_min(date, tr_mn, mx+sz);
- pos[mx] = ftell(in);
- fclose(in);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement