rendered paste body#include <stdio.h>#define DO3 16581375#define DO2 65025#define DO1 255#define MOD 1000000unsigned long hash(unsigned long a);unsigned long FIND_SET(unsigned long set);unsigned long MAKE_SET(unsigned long IP1, unsigned long IP2);struct wierzcholek{ unsigned long SET; unsigned long rank;} ELEMENT[1000000];int main(){ unsigned long ip1_1, ip1_2, ip1_3, ip1_4; unsigned long ip2_1, ip2_2, ip2_3, ip2_4; unsigned long IP1, IP2, key1, key2; unsigned long i; char znak; for(i=0; i<1000000; i++) { ELEMENT[i].SET=1000001; ELEMENT[i].rank=1; } while(scanf("%c", &znak)!=EOF) { scanf(" %lu.%lu.%lu.%lu", &ip1_1, &ip1_2, &ip1_3, &ip1_4); key1=(ip1_1-1)*DO3 + (ip1_2-1)*DO2 + (ip1_3-1)*DO1 + ip1_4; IP1=hash(key1); scanf(" %lu.%lu.%lu.%lu\n", &ip2_1, &ip2_2, &ip2_3, &ip2_4); key2=(ip2_1-1)*DO3 + (ip2_2-1)*DO2 + (ip2_3-1)*DO1 + ip2_4; IP2=hash(key2); if(znak=='B') /*budowanie drzewa*/ { if(ELEMENT[IP1].SET==1000001 && ELEMENT[IP2].SET==1000001) { ELEMENT[IP1].SET=IP1; ELEMENT[IP1].rank=2; ELEMENT[IP2].SET=IP1; ELEMENT[IP2].rank=2; /*printf("FILIPEK1\t%lu set1=%lu rank%lu\t%lu set2=%lu rank%lu\n", IP1, ELEMENT[IP1].SET, ELEMENT[IP1].rank, IP2, ELEMENT[IP2].SET, ELEMENT[IP2].rank);*/ } else if(FIND_SET(IP1)!=FIND_SET(IP2)) { /*printf("FIL2\t%lu set1=%lu rank%lu\t%lu set2=%lu rank%lu\n", IP1, ELEMENT[IP1].SET, ELEMENT[IP1].rank, IP2, ELEMENT[IP2].SET, ELEMENT[IP2].rank);*/ MAKE_SET(IP1, IP2); /*printf("FIL2'\t%lu set1=%lu rank%lu\t%lu set2=%lu rank%lu\n", IP1, ELEMENT[IP1].SET, ELEMENT[IP1].rank, IP2, ELEMENT[IP2].SET, ELEMENT[IP2].rank);*/ } } else /*zapytanie czy sa z tej samej sieci*/ { if(ELEMENT[IP1].SET!=1000001 && ELEMENT[IP2].SET!=1000001 && FIND_SET(IP1)==FIND_SET(IP2)) printf("%c\n", 'T'); else printf("%c\n", 'N'); } /*printf("%lu.%lu.%lu.%lu %lu.%lu.%lu.%lu\n", ip1_1, ip1_2, ip1_3, ip1_4, ip2_1, ip2_2, ip2_3, ip2_4);*/ /*printf("%c %lu %lu\t%lu %lu\t%lu %lu\n", znak, key1, key2, IP1, IP2, ELEMENT[10].SET, ELEMENT[100].rank);*/ } return 0;}unsigned long hash(unsigned long a){ a=a%MOD; return a;}unsigned long FIND_SET(unsigned long set){ if(ELEMENT[set].SET==1000001) return 1000001; else { while(ELEMENT[set].SET!=set && ELEMENT[set].SET!=1000001) { set=ELEMENT[set].SET; } return set; }}unsigned long MAKE_SET(unsigned long IP1, unsigned long IP2){ unsigned long set1, set2; set1=FIND_SET(IP1); set2=FIND_SET(IP2); if(ELEMENT[set1].rank==ELEMENT[set2].rank) { ELEMENT[set1].rank+=ELEMENT[set2].rank; ELEMENT[set2].rank=ELEMENT[set1].rank; ELEMENT[set1].SET=set1; ELEMENT[IP1].SET=set1; ELEMENT[set2].SET=set1; ELEMENT[IP2].SET=set1; } else if(ELEMENT[set1].rank > ELEMENT[set2].rank) { ELEMENT[set1].rank+=ELEMENT[set2].rank; ELEMENT[set2].rank=ELEMENT[set1].rank; if(set2!=1000001) ELEMENT[set2].SET=set1; else ELEMENT[IP2].SET=set1; } else if(ELEMENT[set1].rank < ELEMENT[set2].rank) { ELEMENT[set2].rank+=ELEMENT[set1].rank; ELEMENT[set1].rank=ELEMENT[set2].rank; ELEMENT[set1].SET=set2; ELEMENT[IP1].SET=set2; ELEMENT[IP2].SET=set2; }}