Advertisement
intsashka

Untitled

Sep 19th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.02 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdbool.h>
  4.  
  5. /*DEBUG*/
  6. enum
  7. {
  8. MAX_LEN_PATH = FILENAME_MAX + 2,
  9. MAX_OPEN_FILES = 100,
  10. MAX_NUM_FROM_FILES = 4
  11. };
  12.  
  13. int mas[MAX_OPEN_FILES][10000], sz[MAX_OPEN_FILES];
  14.  
  15. void
  16. my_func(char path[MAX_OPEN_FILES][MAX_LEN_PATH], int num)
  17. {
  18. FILE *out = stdout;
  19. FILE *in = NULL;
  20. printf("FUNC\n");
  21. int i, j, pos[MAX_OPEN_FILES], sz[MAX_OPEN_FILES];
  22. for(i = 0; i < num; ++i) {
  23. in = fopen(path[i], "r");
  24. sz[i] = 0;
  25. while(fscanf(in, "%d", &mas[i][sz[i]]) == 1) {
  26. ++sz[i];
  27. }
  28. fclose(in);
  29. }
  30.  
  31. for(i = 0; i < num; ++i) {
  32. pos[i] = 0;
  33. }
  34. bool flag;
  35. for(i = 0; i < sz[0]; ++i) {
  36. flag = true;
  37. for(j = 1; j < num; ++j) {
  38. while(pos[j] < sz[j] && mas[j][pos[j]] > mas[0][i]) {
  39. ++pos[j];
  40. }
  41. if(pos[j] == sz[j] || mas[j][pos[j]] != mas[0][i]) {
  42. flag = false;
  43. break;
  44. }
  45. }
  46. if(flag) {
  47. fprintf(out, "%d ", mas[0][i]);
  48. }
  49. }
  50. fprintf(out, "\n");
  51. }
  52.  
  53. #include <stdlib.h>
  54. #include <time.h>
  55. void
  56. my_gen(int num, int N)
  57. {
  58. FILE *in = fopen("input.txt", "w");
  59. FILE *ff = NULL;
  60. char path[100], number[100];
  61. int i, j, c;
  62. srand(time(NULL));
  63. for(i=0; i<num; ++i)
  64. {
  65. path[0] = 'i';
  66. path[1] = 'n';
  67. path[2] = i/10 + '0';
  68. path[3] = i%10 + '0';
  69. path[4] = 0;
  70. strcat(path, ".txt");
  71. fprintf(in, "%s\n", path);
  72. ff = fopen(path, "w");
  73. c = rand()%10;
  74. for(j = 0; j < N; ++j) {
  75. fprintf(ff, "%d ", c);
  76. c -= rand()%2 + 1;
  77. }
  78. fclose(ff);
  79. }
  80. fclose(in);
  81. }
  82.  
  83. int
  84. get_min(int *date, int *tr, int l, int r)
  85. {
  86. int ans = tr[l];
  87. for(; l <= r; l >>= 1, r >>= 1) {
  88. if(l & 1) {
  89. if(date[ans] > date[tr[l]]) {
  90. ans = tr[l];
  91. }
  92. ++l;
  93. }
  94. if(!(r & 1)) {
  95. if(date[ans] > date[tr[r]]) {
  96. ans = tr[r];
  97. }
  98. --r;
  99. }
  100. }
  101. return ans;
  102. }
  103.  
  104. void
  105. change_min(int *date, int *tr, int i)
  106. {
  107. int op1, op2;
  108. for(i >>= 1; i; i >>= 1) {
  109. op1 = tr[(i << 1)];
  110. op2 = tr[(i << 1) + 1];
  111. if(date[op1] < date[op2]) {
  112. tr[i] = op1;
  113. } else {
  114. tr[i] = op2;
  115. }
  116. }
  117. }
  118.  
  119. int
  120. get_max(int *date, int *tr, int l, int r)
  121. {
  122. int ans = tr[l];
  123. for(; l <= r; l >>= 1, r >>= 1) {
  124. if(l & 1) {
  125. if(date[ans] < date[tr[l]]) {
  126. ans = tr[l];
  127. }
  128. ++l;
  129. }
  130. if(!(r & 1)) {
  131. if(date[ans] < date[tr[r]]) {
  132. ans = tr[r];
  133. }
  134. --r;
  135. }
  136. }
  137. return ans;
  138. }
  139.  
  140. void
  141. change_max(int *date, int *tr, int i)
  142. {
  143. int op1, op2;
  144. for(i >>= 1; i > 0; i >>= 1) {
  145. op1 = tr[(i << 1)];
  146. op2 = tr[(i << 1) + 1];
  147. if(date[op1] > date[op2]) {
  148. tr[i] = op1;
  149. } else {
  150. tr[i] = op2;
  151. }
  152. }
  153. }
  154.  
  155. int
  156. main(void)
  157. {
  158. freopen("input.txt", "r", stdin);
  159.  
  160. //my_gen(100, 1000);
  161. //return 0;
  162. enum
  163. {
  164. MAX_LEN_PATH = FILENAME_MAX + 2,
  165. MAX_OPEN_FILES = 100,
  166. MAX_NUM_FROM_FILES = 4
  167. };
  168.  
  169. int i, j;
  170. char path[MAX_OPEN_FILES][MAX_LEN_PATH];
  171. int len, num = 0;
  172.  
  173. fgets(path[num], MAX_LEN_PATH, stdin);
  174. while(!feof(stdin)) {
  175. len = strlen(path[num]);
  176. if(len && path[num][len-1] == '\n') {
  177. path[num][--len] = 0;
  178. }
  179. if(len && path[num][len-1] == '\r') {
  180. path[num][--len] = 0;
  181. }
  182.  
  183. if(len) {
  184. ++num;
  185. }
  186. fgets(path[num], MAX_LEN_PATH, stdin);
  187. }
  188.  
  189. long pos[MAX_OPEN_FILES];
  190. int date[MAX_OPEN_FILES];
  191. int tr_mn[1000], tr_mx[1000], sz = 128;
  192.  
  193. for(i = 0; i < num; ++i) {
  194. tr_mn[i + sz] = tr_mx[i + sz] = i;
  195. }
  196. for(i = num; i < sz; ++i) {
  197. tr_mn[i + sz] = tr_mx[i + sz] = num-1;
  198. }
  199.  
  200. for(i=0; i<num; ++i) {
  201. pos[i] = 0;
  202. }
  203.  
  204. printf("num=%d\n", num);
  205. FILE *in = NULL;
  206. int fli = 0;
  207. for(i = 0; i < num; ++i) {
  208. in = fopen(path[i], "r");
  209. if(fscanf(in, "%d", &date[i]) <= 0) {
  210. fclose(in);
  211. printf("\n");
  212. return 0;
  213. }
  214. pos[i] = ftell(in);
  215. fclose(in);
  216. }
  217. for(i = 0; i < num; ++i) {
  218.  
  219. change_max(date, tr_mx, i+sz);
  220. change_min(date, tr_mn, i+sz);
  221. }
  222. // my_func(path, num);
  223.  
  224. int mn, mx;
  225. while(1) {
  226. mn = mx = 0;
  227. /*for(i = 1; i < num; ++i) {
  228. if(date[i] > date[mx]) {
  229. mx = i;
  230. }
  231. if(date[i] < date[mn]) {
  232. mn = i;
  233. }
  234. }*/
  235. mn = get_min(date, tr_mn, sz, sz+num-1);
  236. mx = get_max(date, tr_mx, sz, sz+num-1);
  237.  
  238. //printf("\n");
  239. // printf("%d %d\n", date[mn], date[tr_mn[1]]);
  240. /*if( date[mn] != date[get_min(date, tr_mn, sz, sz+num-1)] ) {
  241. printf("BAD1\n");
  242. }
  243. if( date[mx] != date[get_max(date, tr_mx, sz, sz+num-1)] ) {
  244. printf("BAD2\n");
  245. printf("%d %d\n", date[mx], date[tr_mx[1]]);
  246. printf("mx=%d %d\n", mx, tr_mx[1]);
  247. for(i=0; i<num; ++i) {
  248. printf("%d ", date[i]);
  249. }
  250. for(i = 0; i < num; ++i) {
  251. change_max(date, tr_mx, i+sz);
  252. change_min(date, tr_mn, i+sz);
  253. }
  254. printf("\n%d %d\n", date[mx] , date[tr_mx[1]]);
  255.  
  256.  
  257.  
  258. return 0;
  259. }*/
  260. //return 0;
  261. //mx = tr_mx[1];
  262. //mn = get_min(date, tr_mn, sz, 2*sz-1);
  263. // mn = get_min(date, tr_mn, sz, 2*sz-1);
  264. //mx = get_max(date, tr_mx, sz, 2*sz-1);
  265. //printf("%d %d\n", mn, mx);
  266. if(date[mn] == date[mx]) {
  267. //printf("%d ", date[0]);
  268. for(i = 0; i < num; ++i) {
  269. in = fopen(path[i], "r");
  270. fseek(in, pos[i], SEEK_SET);
  271.  
  272. if(fscanf(in, "%d", &date[i]) <= 0) {
  273. fclose(in);
  274. printf("\n");
  275. return 0;
  276. }
  277.  
  278. pos[i] = ftell(in);
  279. fclose(in);
  280. }
  281. for(i = 0; i < num; ++i) {
  282. change_max(date, tr_mx, i+sz);
  283. change_min(date, tr_mn, i+sz);
  284. }
  285. } else {
  286. in = fopen(path[mx], "r");
  287. fseek(in, pos[mx], SEEK_SET);
  288.  
  289. if(fscanf(in, "%d", &date[mx]) <= 0) {
  290. fclose(in);
  291. break;
  292. }
  293.  
  294. change_max(date, tr_mx, mx+sz);
  295. change_min(date, tr_mn, mx+sz);
  296.  
  297. pos[mx] = ftell(in);
  298. fclose(in);
  299. }
  300. }
  301.  
  302.  
  303.  
  304. return 0;
  305. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement