Guest User

Untitled

a guest
Aug 3rd, 2018
790
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define fr first
  4.  
  5. #define sc second
  6.  
  7. #define m_p make_pair
  8.  
  9. using namespace std;
  10.  
  11. typedef long long ll;
  12.  
  13. typedef unsigned long long ull;
  14.  
  15. typedef long double ld;
  16.  
  17. typedef unsigned int uint;
  18.  
  19. ll sqr(ll x){
  20. return x * x;
  21. }
  22.  
  23. int mysqrt(ll x){
  24. int l = 0, r = 1e9 + 1;
  25. while (r - l > 1){
  26. int m = (l + r) / 2;
  27. if (m * (ll)m <= x)
  28. l = m;
  29. else
  30. r = m;
  31. }
  32. return l;
  33. }
  34.  
  35. mt19937 rnd(1227);
  36.  
  37. mt19937_64 rndll(12365);
  38.  
  39. ll AR = 19, BR = 13, CR = 23, XR = 228, YR = 322, MODR = 1e9 + 993;
  40.  
  41. ll myrand(){
  42. ll ZR = (XR * AR + YR * BR + CR) % MODR;
  43. XR = YR;
  44. YR = ZR;
  45. return ZR;
  46. }
  47.  
  48. int gcd(int a, int b){
  49. return a ? gcd(b % a, a) : b;
  50. }
  51.  
  52. int gcdex(int a, int b, int &x, int &y){
  53. if (a == 0){
  54. x = 0;
  55. y = 1;
  56. return b;
  57. }
  58. int x1, y1;
  59. int ret = gcdex(b % a, a, x1, y1);
  60. x = y1 - (b / a) * x1;
  61. y = x1;
  62. return ret;
  63. }
  64.  
  65. const int Mod = 1e9 + 7;
  66.  
  67. int Bpow(int x, int y){
  68. int ret = 1;
  69. int w = x;
  70. while (y){
  71. if (y & 1)
  72. ret = (ret * (ll)w) % Mod;
  73. w = (w * (ll)w) % Mod;
  74. y >>= 1;
  75. }
  76. return ret;
  77. }
  78.  
  79. int Bdiv(int x){
  80. int a, b;
  81. gcdex(x, Mod, a, b);
  82. if (a < 0)
  83. a += Mod;
  84. return a;
  85. }
  86.  
  87. int Bdiv(int x, int y){
  88. return (x * (ll)Bpow(y, Mod - 2)) % Mod;
  89. }
  90.  
  91. void setmin(int &x, int y){
  92. x = min(x, y);
  93. }
  94.  
  95. void setmax(int &x, int y){
  96. x = max(x, y);
  97. }
  98.  
  99. void setmin(ll &x, ll y){
  100. x = min(x, y);
  101. }
  102.  
  103. void setmax(ll &x, ll y){
  104. x = max(x, y);
  105. }
  106.  
  107. const ll llinf = 2e18 + 100;
  108.  
  109. const double eps = 1e-9;
  110.  
  111. const int maxn = 4e5 + 100, maxw = 1e6 + 100, inf = 2e9 + 100, sq = 300, mod = 1e9 + 7, LG = 17;
  112.  
  113. struct seg_tree{
  114. bool v;
  115. seg_tree *l, *r;
  116. };
  117.  
  118. typedef seg_tree * ptr;
  119.  
  120. ptr create(){
  121. ptr t = new seg_tree;
  122. t->v = 0;
  123. t->l = 0;
  124. t->r = 0;
  125. return t;
  126. }
  127.  
  128. ptr build(int l, int r){
  129. ptr t = create();
  130. if (l == r)
  131. return t;
  132. int m = (l + r) / 2;
  133. t->l = build(l, m);
  134. t->r = build(m + 1, r);
  135. return t;
  136. }
  137.  
  138. ptr update(ptr now, int l, int r, int id, int w){
  139. ptr t = create();
  140. if (l == r){
  141. t->v = w;
  142. return t;
  143. }
  144. int m = (l + r) / 2;
  145. if (id <= m)
  146. t->l = update(now->l, l, m, id, w),
  147. t->r = now->r;
  148. else
  149. t->l = now->l,
  150. t->r = update(now->r, m + 1, r, id, w);
  151. t->v = t->l->v | t->r->v;
  152. return t;
  153. }
  154.  
  155. void get(ptr &t, int tl, int tr, int l, int r, vector<int> &h){
  156. if (l > r || !t->v)
  157. return;
  158. if (tl == tr){
  159. h.push_back(l);
  160. t->v = 0;
  161. return;
  162. }
  163. int m = (tl + tr) / 2;
  164. get(t->l, tl, m, l, min(r, m), h);
  165. get(t->r, m + 1, tr, max(l, m + 1), r, h);
  166. t->v = t->l->v | t->r->v;
  167. }
  168.  
  169. pair<int, int> start, finish;
  170.  
  171. int n;
  172.  
  173. pair<pair<int, int>, pair<int, int> > rec[maxn];
  174.  
  175. map<int, int> mpik;
  176.  
  177. vector<int> srt;
  178.  
  179. vector<pair<int, pair<int, int> > > seg[2];
  180.  
  181. int d[maxn];
  182.  
  183. ptr q[maxn];
  184.  
  185. pair<int, int> bo[maxn];
  186.  
  187. int main()
  188. {
  189. #ifdef ONPC
  190. //ifstream cin("a.in");
  191. //ofstream cout("a.out");
  192. freopen("a.in", "r", stdin);
  193. freopen("a.out", "w", stdout);
  194. #else
  195. //ifstream cin("gymnasts.in");
  196. //ofstream cout("gymnasts.out");
  197. //freopen("sort.in", "r", stdin);
  198. //freopen("sort.out", "w", stdout);
  199. #endif // ONPC
  200. ios::sync_with_stdio(0);
  201. cin.tie(0);
  202. cout.tie(0);
  203. vector<pair<int, pair<int, int> > > o;
  204. cin >> start.fr >> start.sc >> finish.fr >> finish.sc;
  205. cin >> n;
  206. for (int i = 0; i < n; i++)
  207. cin >> rec[i].fr.fr >> rec[i].fr.sc >> rec[i].sc.fr >> rec[i].sc.sc;
  208. for (int t = 0; t < 2; t++){
  209. for (int i = 0; i < n; i++)
  210. srt.emplace_back(rec[i].fr.fr),
  211. srt.emplace_back(rec[i].fr.sc);
  212. srt.emplace_back(start.fr);
  213. srt.emplace_back(finish.fr);
  214. sort(srt.begin(), srt.end());
  215. srt.resize(unique(srt.begin(), srt.end()) - srt.begin());
  216. for (int i : srt)
  217. mpik[i] = mpik.size() - 1;
  218. for (int i = 0; i < n; i++)
  219. rec[i].fr.fr = mpik[rec[i].fr.fr],
  220. rec[i].fr.sc = mpik[rec[i].fr.sc];
  221. start.fr = mpik[start.fr];
  222. finish.fr = mpik[finish.fr];
  223. srt.clear();
  224. mpik.clear();
  225. for (int i = 0; i < n; i++)
  226. swap(rec[i].fr, rec[i].sc);
  227. swap(start.fr, start.sc);
  228. swap(finish.fr, finish.sc);
  229. }
  230. for (int t = 0; t < 2; t++){
  231. vector<pair<int, pair<int, int> > > que;
  232. for (int i = 0; i < n; i++)
  233. que.emplace_back(rec[i].sc.fr, rec[i].fr),
  234. que.emplace_back(rec[i].sc.sc, rec[i].fr),
  235. que.emplace_back(rec[i].sc.fr, m_p(inf, rec[i].fr.fr)),
  236. que.emplace_back(rec[i].sc.fr, m_p(inf, rec[i].fr.sc)),
  237. que.emplace_back(rec[i].sc.sc, m_p(-inf, rec[i].fr.fr)),
  238. que.emplace_back(rec[i].sc.sc, m_p(-inf, rec[i].fr.sc)),
  239. swap(rec[i].fr, rec[i].sc);
  240. que.emplace_back(start.sc, m_p(start.fr, start.fr));
  241. que.emplace_back(finish.sc, m_p(finish.fr, finish.fr));
  242. swap(start.fr, start.sc);
  243. swap(finish.fr, finish.sc);
  244. sort(que.begin(), que.end());
  245. set<int> st;
  246. st.insert(-1);
  247. st.insert(inf);
  248. for (auto its : que)
  249. if (its.sc.fr == -inf)
  250. st.erase(its.sc.sc);
  251. else
  252. if (its.sc.fr == inf)
  253. st.insert(its.sc.sc);
  254. else{
  255. set<int> :: iterator it = st.upper_bound(its.sc.fr);
  256. it--;
  257. int le = *it;
  258. it = st.lower_bound(its.sc.sc);
  259. seg[t].emplace_back(its.fr, m_p(le, *it));
  260. }
  261. sort(seg[t].begin(), seg[t].end());
  262. seg[t].resize(unique(seg[t].begin(), seg[t].end()) - seg[t].begin());
  263. }
  264. n = seg[0].size() + seg[1].size();
  265. for (int t = 0; t < 2; t++){
  266. for (int i = 0; i < seg[t].size(); i++){
  267. int l = lower_bound(seg[!t].begin(), seg[!t].end(), m_p(seg[t][i].sc.fr, m_p(-inf, -inf))) - seg[!t].begin();
  268. 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;
  269. if (!t)
  270. l += seg[0].size(), r += seg[0].size();
  271. bo[i + t * seg[0].size()] = m_p(l, r);
  272. }
  273. vector<pair<int, pair<int, int> > > que;
  274. for (int i = 0; i < seg[t].size(); i++)
  275. que.emplace_back(seg[t][i].fr, m_p(i + t * seg[0].size(), 0));
  276. for (int i = 0; i < seg[!t].size(); i++)
  277. que.emplace_back(seg[!t][i].sc.fr, m_p(-inf, i + !t * seg[0].size())),
  278. que.emplace_back(seg[!t][i].sc.sc, m_p(inf, i + !t * seg[0].size()));
  279. sort(que.begin(), que.end());
  280. ptr now = build(0, n - 1);
  281. for (auto its : que)
  282. if (its.sc.fr == -inf)
  283. now = update(now, 0, n - 1, its.sc.sc, 1);
  284. else
  285. if (its.sc.fr == inf)
  286. now = update(now, 0, n - 1, its.sc.sc, 0);
  287. else
  288. q[its.sc.fr] = now;
  289. }
  290. for (int i = 0; i < n; i++)
  291. d[i] = -1;
  292. int sta, stb, fina, finb;
  293. for (int i = 0; i < seg[0].size(); i++)
  294. if (seg[0][i].fr == start.sc && seg[0][i].sc.fr <= start.fr && seg[0][i].sc.sc >= start.fr)
  295. sta = i;
  296. for (int i = 0; i < seg[1].size(); i++)
  297. if (seg[1][i].fr == start.fr && seg[1][i].sc.fr <= start.sc && seg[1][i].sc.sc >= start.sc)
  298. stb = seg[0].size() + i;
  299. for (int i = 0; i < seg[0].size(); i++)
  300. if (seg[0][i].fr == finish.sc && seg[0][i].sc.fr <= finish.fr && seg[0][i].sc.sc >= finish.fr)
  301. fina = i;
  302. for (int i = 0; i < seg[1].size(); i++)
  303. if (seg[1][i].fr == finish.fr && seg[1][i].sc.fr <= finish.sc && seg[1][i].sc.sc >= finish.sc)
  304. finb = seg[0].size() + i;
  305. d[sta] = 0;
  306. d[stb] = 0;
  307. queue<int> que;
  308. que.push(sta);
  309. que.push(stb);
  310. while (!que.empty()){
  311. int id = que.front();
  312. que.pop();
  313. if (id == fina || id == finb){
  314. cout << d[id] + 1;
  315. return 0;
  316. }
  317. vector<int> g;
  318. get(q[id], 0, n - 1, bo[id].fr, bo[id].sc, g);
  319. for (int i : g)
  320. if (d[i] == -1)
  321. d[i] = d[id] + 1, que.push(i);
  322. }
  323. assert(0);
  324. }
Advertisement
Add Comment
Please, Sign In to add comment