Advertisement
Guest User

Untitled

a guest
Aug 3rd, 2018
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.32 KB | None | 0 0
  1. /*
  2. .:*+=%@@@@@@=-.
  3. .:=@#@@@#@@#######%==*.
  4. .-=####@######%*-.....:%##%.
  5. .*@###########%+:--........-%@-
  6. .*@##############@+--.........-:%-
  7. .+##################@==%%%%=+*:----+.
  8. .-@####################%++%@@@@@=+**%@@*
  9. .%###################@%%@@@###@%+:--%@@%.
  10. -@###################@%%%%*::*%++:-----=@+.
  11. -#####################@%=++++++*:-------.-=:
  12. .+####################@%++*::-:::--::*:::***=:
  13. .@#####################%=++*::::-:::++*=##@@#@-
  14. ..#####################@%%=++**:::::**+%@#@%%##-..
  15. .%####################@@%=+++*+****::*=@######@.
  16. .=######################@%%==+==++**+=@%@##@###+:...
  17. -#######################@@@%%%===++=@@@%=++===*::--...
  18. -########################@@@@@@@%==%%=++==@@:::::*:--.
  19. ..:#########################@@@@@@%%======++++::-..:-.--...
  20. %#############################@###@%%@@%==%=%*----.--.::---.
  21. #############################################*-:*:-:---*---- .
  22. #############################################*--*--:---*---:-.
  23. #############################################+--::--::-*::-::.
  24. ###########################################+:*-.---.---.:---*-..
  25. ###########################################**:-----------------.
  26. ##########################################@::**:--::::::--:::::-
  27. ###########################################:--:*:::::::::**::*+*
  28. ###########################################=:::***::::::**:::*+*
  29. ############################@@@@@@#########@+****::::********+++
  30. ############################@%%%%%@@@@@@@###%+***::::::::***+==+
  31. ############################@%%%%%%%%%%%@####=+:::-::::-::*+=%%+
  32. #############################@%%%%%%%%%%@#####=::--------:*=%@%+
  33. %###########################@%%%%==%%%%%%@##@#=:------..-:+%@@%=
  34. ----------------------------------------------
  35. --------------------------------------------
  36. ----------------------------------------------
  37. --------------------------------------------
  38. ----------------------------------------------
  39.  
  40. o###########oo
  41. o##" ""##o
  42. o#" "##
  43. o#" "#o
  44. #" ## ## "##
  45. #" ##
  46. # ################### #
  47. # #
  48. # #
  49. # #
  50. # #
  51. # #
  52. # #
  53. #o #
  54. "#o ##
  55. "#o ##
  56. "#o o#"
  57. "#o ##
  58. "#o o#"
  59. "#ooo ooo#######oo
  60. ############### "######o
  61. o###"" "###o # ###
  62. o###o oooo ### oo####"
  63. o###**# #**# ############"
  64. ""##""""""""""########### #
  65. # oooooooo#"#** ## #
  66. # # # # ** ## #
  67. #o# #o# *****###ooo#
  68. ##
  69. ## o###o
  70. ## o##***##
  71. o########## #***#**##o
  72. o##" ""### #***##***#
  73. o#######o ### oo#### ##**####*#
  74. o##" ""#############"" ##****###
  75. ##" ## ##*##*###
  76. ## ### ##### ##
  77. ## ### # ## #
  78. ## ## #
  79. ## ##
  80. ## ###
  81. ## ###oo
  82. ### ""###
  83. ###
  84. ###
  85. */
  86.  
  87. ///YEAH IM THE BEST I'VE EVER WAS
  88.  
  89. ///SO HAPPY
  90.  
  91. #include <bits/stdc++.h>
  92.  
  93. #define fr first
  94.  
  95. #define sc second
  96.  
  97. #define m_p make_pair
  98.  
  99. //#include <ext/pb_ds/assoc_container.hpp>
  100.  
  101. //using namespace __gnu_pbds;
  102.  
  103. //gp_hash_table<int, int> table;
  104.  
  105. //#pragma GCC optimize("O3")
  106. //#pragma GCC optimize("Ofast,no-stack-protector")
  107. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
  108. //#pragma GCC target("avx,tune=native")
  109. //float __attribute__((aligned(32)))
  110.  
  111. /*char memory[(int)1e8];
  112.  
  113. char memorypos;
  114.  
  115. inline void * operator new(size_t n){
  116. char * ret = memory + memorypos;
  117. memorypos += n;
  118. return (void *)ret;
  119. }
  120.  
  121. inline void operator delete(void *){}
  122. */
  123.  
  124. using namespace std;
  125.  
  126. typedef long long ll;
  127.  
  128. typedef unsigned long long ull;
  129.  
  130. typedef long double ld;
  131.  
  132. typedef unsigned int uint;
  133.  
  134. ll sqr(ll x){
  135. return x * x;
  136. }
  137.  
  138. int mysqrt(ll x){
  139. int l = 0, r = 1e9 + 1;
  140. while (r - l > 1){
  141. int m = (l + r) / 2;
  142. if (m * (ll)m <= x)
  143. l = m;
  144. else
  145. r = m;
  146. }
  147. return l;
  148. }
  149.  
  150. mt19937 rnd(1227);
  151.  
  152. mt19937_64 rndll(12365);
  153.  
  154. ll AR = 19, BR = 13, CR = 23, XR = 228, YR = 322, MODR = 1e9 + 993;
  155.  
  156. ll myrand(){
  157. ll ZR = (XR * AR + YR * BR + CR) % MODR;
  158. XR = YR;
  159. YR = ZR;
  160. return ZR;
  161. }
  162.  
  163. int gcd(int a, int b){
  164. return a ? gcd(b % a, a) : b;
  165. }
  166.  
  167. int gcdex(int a, int b, int &x, int &y){
  168. if (a == 0){
  169. x = 0;
  170. y = 1;
  171. return b;
  172. }
  173. int x1, y1;
  174. int ret = gcdex(b % a, a, x1, y1);
  175. x = y1 - (b / a) * x1;
  176. y = x1;
  177. return ret;
  178. }
  179.  
  180. const int Mod = 1e9 + 7;
  181.  
  182. int Bpow(int x, int y){
  183. int ret = 1;
  184. int w = x;
  185. while (y){
  186. if (y & 1)
  187. ret = (ret * (ll)w) % Mod;
  188. w = (w * (ll)w) % Mod;
  189. y >>= 1;
  190. }
  191. return ret;
  192. }
  193.  
  194. int Bdiv(int x){
  195. int a, b;
  196. gcdex(x, Mod, a, b);
  197. if (a < 0)
  198. a += Mod;
  199. return a;
  200. }
  201.  
  202. int Bdiv(int x, int y){
  203. return (x * (ll)Bpow(y, Mod - 2)) % Mod;
  204. }
  205.  
  206. void setmin(int &x, int y){
  207. x = min(x, y);
  208. }
  209.  
  210. void setmax(int &x, int y){
  211. x = max(x, y);
  212. }
  213.  
  214. void setmin(ll &x, ll y){
  215. x = min(x, y);
  216. }
  217.  
  218. void setmax(ll &x, ll y){
  219. x = max(x, y);
  220. }
  221.  
  222. const ll llinf = 2e18 + 100;
  223.  
  224. const double eps = 1e-9;
  225.  
  226. const int maxn = 4e5 + 100, maxw = 1e6 + 100, inf = 2e9 + 100, sq = 300, mod = 1e9 + 7, LG = 17;
  227.  
  228. struct seg_tree{
  229. bool v;
  230. int l, r;
  231. };
  232.  
  233. seg_tree p[maxn * 100];
  234.  
  235. int cnt;
  236.  
  237. int create(){
  238. return cnt++;
  239. }
  240.  
  241. int build(int l, int r){
  242. int t = create();
  243. if (l == r)
  244. return t;
  245. int m = (l + r) / 2;
  246. p[t].l = build(l, m);
  247. p[t].r = build(m + 1, r);
  248. return t;
  249. }
  250.  
  251. int update(int now, int l, int r, int id, int w){
  252. int t = create();
  253. if (l == r){
  254. p[t].v = w;
  255. return t;
  256. }
  257. int m = (l + r) / 2;
  258. if (id <= m)
  259. p[t].l = update(p[now].l, l, m, id, w),
  260. p[t].r = p[now].r;
  261. else
  262. p[t].l = p[now].l,
  263. p[t].r = update(p[now].r, m + 1, r, id, w);
  264. p[t].v = p[p[t].l].v | p[p[t].r].v;
  265. return t;
  266. }
  267.  
  268. void get(int t, int tl, int tr, int l, int r, vector<int> &h){
  269. if (l > r || !p[t].v)
  270. return;
  271. if (tl == tr){
  272. h.push_back(l);
  273. p[t].v = 0;
  274. return;
  275. }
  276. int m = (tl + tr) / 2;
  277. get(p[t].l, tl, m, l, min(r, m), h);
  278. get(p[t].r, m + 1, tr, max(l, m + 1), r, h);
  279. p[t].v = p[p[t].l].v | p[p[t].r].v;
  280. }
  281.  
  282. pair<int, int> start, finish;
  283.  
  284. int n;
  285.  
  286. pair<pair<int, int>, pair<int, int> > rec[maxn];
  287.  
  288. map<int, int> mpik;
  289.  
  290. vector<int> srt;
  291.  
  292. vector<pair<int, pair<int, int> > > seg[2];
  293.  
  294. int d[maxn];
  295.  
  296. int q[maxn];
  297.  
  298. pair<int, int> bo[maxn];
  299.  
  300. int main()
  301. {
  302. #ifdef ONPC
  303. //ifstream cin("a.in");
  304. //ofstream cout("a.out");
  305. freopen("a.in", "r", stdin);
  306. freopen("a.out", "w", stdout);
  307. #else
  308. //ifstream cin("gymnasts.in");
  309. //ofstream cout("gymnasts.out");
  310. //freopen("sort.in", "r", stdin);
  311. //freopen("sort.out", "w", stdout);
  312. #endif // ONPC
  313. ios::sync_with_stdio(0);
  314. cin.tie(0);
  315. cout.tie(0);
  316. vector<pair<int, pair<int, int> > > o;
  317. cin >> start.fr >> start.sc >> finish.fr >> finish.sc;
  318. cin >> n;
  319. for (int i = 0; i < n; i++)
  320. cin >> rec[i].fr.fr >> rec[i].fr.sc >> rec[i].sc.fr >> rec[i].sc.sc;
  321. for (int t = 0; t < 2; t++){
  322. for (int i = 0; i < n; i++)
  323. srt.push_back(rec[i].fr.fr),
  324. srt.push_back(rec[i].fr.sc);
  325. srt.push_back(start.fr);
  326. srt.push_back(finish.fr);
  327. sort(srt.begin(), srt.end());
  328. srt.resize(unique(srt.begin(), srt.end()) - srt.begin());
  329. for (int i : srt)
  330. mpik[i] = mpik.size() - 1;
  331. for (int i = 0; i < n; i++)
  332. rec[i].fr.fr = mpik[rec[i].fr.fr],
  333. rec[i].fr.sc = mpik[rec[i].fr.sc];
  334. start.fr = mpik[start.fr];
  335. finish.fr = mpik[finish.fr];
  336. srt.clear();
  337. mpik.clear();
  338. for (int i = 0; i < n; i++)
  339. swap(rec[i].fr, rec[i].sc);
  340. swap(start.fr, start.sc);
  341. swap(finish.fr, finish.sc);
  342. }
  343. for (int t = 0; t < 2; t++){
  344. vector<pair<int, pair<int, int> > > que;
  345. for (int i = 0; i < n; i++)
  346. que.push_back(m_p(rec[i].sc.fr, rec[i].fr)),
  347. que.push_back(m_p(rec[i].sc.sc, rec[i].fr)),
  348. que.push_back(m_p(rec[i].sc.fr, m_p(inf, rec[i].fr.fr))),
  349. que.push_back(m_p(rec[i].sc.fr, m_p(inf, rec[i].fr.sc))),
  350. que.push_back(m_p(rec[i].sc.sc, m_p(-inf, rec[i].fr.fr))),
  351. que.push_back(m_p(rec[i].sc.sc, m_p(-inf, rec[i].fr.sc))),
  352. swap(rec[i].fr, rec[i].sc);
  353. que.push_back(m_p(start.sc, m_p(start.fr, start.fr)));
  354. que.push_back(m_p(finish.sc, m_p(finish.fr, finish.fr)));
  355. swap(start.fr, start.sc);
  356. swap(finish.fr, finish.sc);
  357. sort(que.begin(), que.end());
  358. set<int> st;
  359. st.insert(-1);
  360. st.insert(inf);
  361. for (auto its : que)
  362. if (its.sc.fr == -inf)
  363. st.erase(its.sc.sc);
  364. else
  365. if (its.sc.fr == inf)
  366. st.insert(its.sc.sc);
  367. else{
  368. set<int> :: iterator it = st.upper_bound(its.sc.fr);
  369. it--;
  370. int le = *it;
  371. it = st.lower_bound(its.sc.sc);
  372. seg[t].push_back(m_p(its.fr, m_p(le, *it)));
  373. }
  374. sort(seg[t].begin(), seg[t].end());
  375. seg[t].resize(unique(seg[t].begin(), seg[t].end()) - seg[t].begin());
  376. }
  377. n = seg[0].size() + seg[1].size();
  378. for (int t = 0; t < 2; t++){
  379. for (int i = 0; i < seg[t].size(); i++){
  380. int l = lower_bound(seg[!t].begin(), seg[!t].end(), m_p(seg[t][i].sc.fr, m_p(-inf, -inf))) - seg[!t].begin();
  381. int r = upper_bound(seg[!t].begin(), seg[!t].end(), m_p(seg[t][i].sc.sc, m_p(inf, inf))) - seg[!t].begin() - 1;
  382. if (!t)
  383. l += seg[0].size(), r += seg[0].size();
  384. bo[i + t * seg[0].size()] = m_p(l, r);
  385. }
  386. vector<pair<int, pair<int, int> > > que;
  387. for (int i = 0; i < seg[t].size(); i++)
  388. que.push_back(m_p(seg[t][i].fr, m_p(i + t * seg[0].size(), 0)));
  389. for (int i = 0; i < seg[!t].size(); i++)
  390. que.push_back(m_p(seg[!t][i].sc.fr, m_p(-inf, i + !t * seg[0].size()))),
  391. que.push_back(m_p(seg[!t][i].sc.sc, m_p(inf, i + !t * seg[0].size())));
  392. sort(que.begin(), que.end());
  393. int now = build(0, n - 1);
  394. for (auto its : que)
  395. if (its.sc.fr == -inf)
  396. now = update(now, 0, n - 1, its.sc.sc, 1);
  397. else
  398. if (its.sc.fr == inf)
  399. now = update(now, 0, n - 1, its.sc.sc, 0);
  400. else
  401. q[its.sc.fr] = now;
  402. }
  403. for (int i = 0; i < n; i++)
  404. d[i] = -1;
  405. int sta, stb, fina, finb;
  406. for (int i = 0; i < seg[0].size(); i++)
  407. if (seg[0][i].fr == start.sc && seg[0][i].sc.fr <= start.fr && seg[0][i].sc.sc >= start.fr)
  408. sta = i;
  409. for (int i = 0; i < seg[1].size(); i++)
  410. if (seg[1][i].fr == start.fr && seg[1][i].sc.fr <= start.sc && seg[1][i].sc.sc >= start.sc)
  411. stb = seg[0].size() + i;
  412. for (int i = 0; i < seg[0].size(); i++)
  413. if (seg[0][i].fr == finish.sc && seg[0][i].sc.fr <= finish.fr && seg[0][i].sc.sc >= finish.fr)
  414. fina = i;
  415. for (int i = 0; i < seg[1].size(); i++)
  416. if (seg[1][i].fr == finish.fr && seg[1][i].sc.fr <= finish.sc && seg[1][i].sc.sc >= finish.sc)
  417. finb = seg[0].size() + i;
  418. d[sta] = 0;
  419. d[stb] = 0;
  420. queue<int> que;
  421. que.push(sta);
  422. que.push(stb);
  423. while (!que.empty()){
  424. int id = que.front();
  425. que.pop();
  426. if (id == fina || id == finb){
  427. cout << d[id] + 1;
  428. return 0;
  429. }
  430. vector<int> g;
  431. get(q[id], 0, n - 1, bo[id].fr, bo[id].sc, g);
  432. for (int i : g)
  433. if (d[i] == -1)
  434. d[i] = d[id] + 1, que.push(i);
  435. }
  436. assert(0);
  437. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement