a53

episodul3

a53
May 23rd, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define Nmax 1005
  4.  
  5. using namespace std;
  6.  
  7. class InParser {
  8. private:
  9. FILE *fin;
  10. char *buff;
  11. int sp;
  12.  
  13. char read_ch() {
  14. ++sp;
  15. if (sp == 4096) {
  16. sp = 0;
  17. fread(buff, 1, 4096, fin);
  18. }
  19. return buff[sp];
  20. }
  21.  
  22. public:
  23. InParser(const char* nume) {
  24. fin = fopen(nume, "r");
  25. buff = new char[4096]();
  26. sp = 4095;
  27. }
  28.  
  29. InParser& operator >> (int &n) {
  30. char c;
  31. while (!isdigit(c = read_ch()) && c != '-');
  32. int sgn = 1;
  33. if (c == '-') {
  34. n = 0;
  35. sgn = -1;
  36. } else {
  37. n = c - '0';
  38. }
  39. while (isdigit(c = read_ch())) {
  40. n = 10 * n + c - '0';
  41. }
  42. n *= sgn;
  43. return *this;
  44. }
  45.  
  46. InParser& operator >> (long long &n) {
  47. char c;
  48. n = 0;
  49. while (!isdigit(c = read_ch()) && c != '-');
  50. long long sgn = 1;
  51. if (c == '-') {
  52. n = 0;
  53. sgn = -1;
  54. } else {
  55. n = c - '0';
  56. }
  57. while (isdigit(c = read_ch())) {
  58. n = 10 * n + c - '0';
  59. }
  60. n *= sgn;
  61. return *this;
  62. }
  63. };
  64.  
  65. class OutParser {
  66. private:
  67. FILE *fout;
  68. char *buff;
  69. int sp;
  70.  
  71. void write_ch(char ch) {
  72. if (sp == 50000) {
  73. fwrite(buff, 1, 50000, fout);
  74. sp = 0;
  75. buff[sp++] = ch;
  76. } else {
  77. buff[sp++] = ch;
  78. }
  79. }
  80.  
  81.  
  82. public:
  83. OutParser(const char* name) {
  84. fout = fopen(name, "w");
  85. buff = new char[50000]();
  86. sp = 0;
  87. }
  88. ~OutParser() {
  89. fwrite(buff, 1, sp, fout);
  90. fclose(fout);
  91. }
  92.  
  93. OutParser& operator << (int vu32) {
  94. if (vu32 <= 9) {
  95. write_ch(vu32 + '0');
  96. } else {
  97. (*this) << (vu32 / 10);
  98. write_ch(vu32 % 10 + '0');
  99. }
  100. return *this;
  101. }
  102.  
  103. OutParser& operator << (long long vu64) {
  104. if (vu64 <= 9) {
  105. write_ch(vu64 + '0');
  106. } else {
  107. (*this) << (vu64 / 10);
  108. write_ch(vu64 % 10 + '0');
  109. }
  110. return *this;
  111. }
  112.  
  113. OutParser& operator << (char ch) {
  114. write_ch(ch);
  115. return *this;
  116. }
  117. OutParser& operator << (const char *ch) {
  118. while (*ch) {
  119. write_ch(*ch);
  120. ++ch;
  121. }
  122. return *this;
  123. }
  124. };
  125.  
  126. InParser fin("episodul3.in");
  127. OutParser fout("episodul3.out");
  128.  
  129. int N, M;
  130. int dx[] = {1, -1, 0, 0};
  131. int dy[] = {0, 0, 1, -1};
  132. int getNode[Nmax][Nmax];
  133. int T[22][Nmax * Nmax];
  134. int nodes;
  135. int dist[Nmax * Nmax];
  136.  
  137. int getKthAncestor(int K, int node)
  138. {
  139. for(int i = 10; i >= 0; i--)
  140. if(K & (1 << i))
  141. {
  142. node = T[i][node];
  143. K -= (1 << i);
  144. }
  145. return node;
  146. }
  147.  
  148. int getLCA(int node1, int node2)
  149. {
  150. if(node1 == node2)
  151. return node1;
  152. int pos = dist[node1] + 1;
  153. int i;
  154. for(i = 0; (1 << i) <= dist[node1]; i++);
  155. for(; i >= 0; i--)
  156. if(T[i][node1] != T[i][node2])
  157. {
  158. node1 = T[i][node1];
  159. node2 = T[i][node2];
  160. pos -= (1 << i);
  161. }
  162. return T[0][node1];
  163. }
  164.  
  165. int main()
  166. {
  167. fin >> N >> M;
  168. while(M--)
  169. {
  170. int t;
  171. fin >> t;
  172. if(t == 1)
  173. {
  174. int i, j;
  175. fin >> i >> j;
  176. getNode[i][j] = ++nodes;
  177. for(int d = 0; d < 4; d++)
  178. if(getNode[i + dx[d]][j + dy[d]] != 0)
  179. T[0][nodes] = getNode[i + dx[d]][j + dy[d]], dist[nodes] = 1 + dist[getNode[i + dx[d]][j + dy[d]]];
  180. if(dist[nodes] == 0)
  181. dist[nodes] = 1;
  182. for(int i = 1; (1 << i) <= dist[nodes]; i++)
  183. T[i][nodes] = T[i - 1][T[i - 1][nodes]];
  184. }
  185. if(t == 2)
  186. {
  187. int i, j, i2, j2;
  188. fin >> i >> j >> i2 >> j2;
  189. int node1 = getNode[i][j];
  190. int node2 = getNode[i2][j2];
  191. if(dist[node1] > dist[node2])
  192. swap(node1, node2);
  193. int sameLevel = getKthAncestor(dist[node2] - dist[node1], node2);
  194. int LCA = getLCA(node1, sameLevel);
  195. fout << dist[node1] + dist[node2] - 2 * dist[LCA] + 1 << "\n";
  196. }
  197. }
  198. return 0;
  199. }
Add Comment
Please, Sign In to add comment