Advertisement
Guest User

Untitled

a guest
Jul 29th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.21 KB | None | 0 0
  1. #define _ijps 0
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <iostream>
  4. #include <cstring>
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <algorithm>
  8. #include <string>
  9. #include <vector>
  10. #include <map>
  11. #include <set>
  12. #include <cmath>
  13.  
  14. using namespace std;
  15.  
  16. #define name "mountain"
  17. typedef long long ll;
  18. #define forn(i, n) for(int i = 0; i < n; i++)
  19. #define fornn(i, a, n) for(int i = a; i < n; i++)
  20. #define mk make_pair
  21.  
  22. const int dd = 1e6 + 7;
  23. const int infi = 1e9 + 7;
  24. const ll inf = 1e18 + 7;
  25.  
  26. vector<int> X, Y;
  27. vector<int> L, K;
  28.  
  29. int main() {
  30.  
  31.     if (_ijps) {
  32.         freopen("input.txt", "r", stdin);
  33.         freopen("output.txt", "w", stdout);
  34.     }
  35.     else {
  36.         freopen(name".in", "r", stdin);
  37.         freopen(name".out", "w", stdout);
  38.     }
  39.  
  40.     int n, q;
  41.     cin >> n >> q;
  42.     ll x, y;
  43.     x = y = 0;
  44.     if (n <= 3000 && q <= 3000 && !_ijps){
  45.         forn(i, n) {
  46.             int l, k;
  47.             cin >> l >> k;
  48.             X.push_back(x);
  49.             Y.push_back(y);
  50.             K.push_back(k);
  51.             x += l;
  52.             y += l * k;
  53.         }
  54.         X.push_back(x);
  55.         K.push_back(0);
  56.         Y.push_back(y);
  57.         forn(i, q) {
  58.             int x, y;
  59.             cin >> x >> y;
  60.             {
  61.                 int t = 0;
  62.                 forn(j, n) {
  63.                     if (X[j] <= x && x <= X[j + 1]) {
  64.                         t = j;
  65.                         break;
  66.                     }
  67.                 }
  68.                 int a, b;
  69.                 a = 0;
  70.                 b = X.back();
  71.                 for (int j = t + 1; j < n; j++) {
  72.                     ll h = Y[j] - 1ll * (X[j] - x) * K[j];
  73.                     if (h > y) {
  74.                         b = X[j];
  75.                         break;
  76.                     }
  77.                 }
  78.                 for (int j = t; j >= 0; j--) {
  79.                     ll h = Y[j] + 1ll * (x - X[j]) * K[j];
  80.                     if (h > y) {
  81.                         a = X[j + 1];
  82.                         break;
  83.                     }
  84.                 }
  85.                 cout << a << ' ' << b << '\n';
  86.             }
  87.         }
  88.         return 0;
  89.     }
  90.     int z = 0;
  91.     forn(i, n) {
  92.         int l, k;
  93.         scanf("%d%d", &l, &k);
  94.         L.push_back(l);
  95.         K.push_back(k);
  96.         z = max(z, abs(k));
  97.     }
  98.     if (z <= 1 && !_ijps) {
  99.         vector<pair<int, int> > Le, Re;
  100.         forn(i, n) {
  101.             int l = L[i], k = K[i];
  102.             X.push_back(x);
  103.             Y.push_back(y);
  104.             K.push_back(k);
  105.             if (k < 0) {
  106.                 int xx = x + y;
  107.                 Re.push_back(mk(xx, i));
  108.             }
  109.             else {
  110.                 int xx = x - y;
  111.                 Le.push_back(mk(xx, i));
  112.             }
  113.             x += l;
  114.             y += l * k;
  115.         }
  116.         X.push_back(x);
  117.         K.push_back(0);
  118.         Y.push_back(y);
  119.         sort(Re.begin(), Re.end());
  120.         sort(Le.begin(), Le.end());
  121.         forn(i, q) {
  122.             int x, y;
  123.             int a, b;
  124.             a = 0, b = X.back();
  125.             scanf("%d%d", &x, &y);
  126.             {
  127.                 int xx = x + y;
  128.                 auto e = upper_bound(Re.begin(), Re.end(), mk(xx, infi));
  129.                 if (e != Re.end()) {
  130.  
  131.                     b = X[e->second];
  132.                 }
  133.             }
  134.             {
  135.                 int xx = x - y;
  136.                 auto e = upper_bound(Le.begin(), Le.end(), mk(xx, -infi));
  137.                 if (e != Le.begin()) {
  138.                     e--;
  139.                     a = X[e->second + 1];
  140.                 }
  141.             }
  142.             cout << a << ' ' << b << '\n';
  143.         }
  144.         return 0;
  145.     }
  146.  
  147.     vector<pair<int, int> > T;
  148.  
  149.     forn(i, q) {
  150.         int x, y;
  151.         scanf("%d%d", &x, &y);
  152.         T.push_back(mk(x, y));
  153.     }
  154.    
  155.     bool okx, oky;
  156.     okx = oky = 1;
  157.     forn(i, q) {
  158.         if (T[i].first != T[0].first) {
  159.             okx = 0;
  160.         }
  161.         if (T[i].second != T[0].second) {
  162.             oky = 0;
  163.         }
  164.     }
  165.     if (okx && !_ijps) {
  166.         forn(i, n) {
  167.             ll l = L[i], k = K[i];
  168.             X.push_back(x);
  169.             Y.push_back(y);
  170.             K.push_back(k);
  171.             x += l;
  172.             y += l * k;
  173.         }
  174.         X.push_back(x);
  175.         K.push_back(0);
  176.         Y.push_back(y);
  177.         vector<int> L(q), R(q, X.back());
  178.  
  179.  
  180.         int x = T[0].first;
  181.         vector<pair<int, int> > W;
  182.         forn(i, q) {
  183.             W.push_back(mk(T[i].second, i));
  184.         }
  185.         sort(W.begin(), W.end());
  186.  
  187.         int t = 0;
  188.         forn(j, n) {
  189.             if (X[j] <= x && x <= X[j + 1]) {
  190.                 t = j;
  191.                 break;
  192.             }
  193.         }
  194.         int l = t, r = t + 1;
  195.         forn(i, W.size()) {
  196.             int y = W[i].first;
  197.             int a, b;
  198.             a = 0;
  199.             b = X.back();
  200.             for (; r < n; r++) {
  201.                 ll h = Y[r] - 1ll * (X[r] - x) * K[r];
  202.                 if (h > y) {
  203.                     b = X[r];
  204.                     break;
  205.                 }
  206.             }
  207.             for (; l >= 0; l--) {
  208.                 ll h = Y[l] + 1ll * (x - X[l]) * K[l];
  209.                 if (h > y) {
  210.                     a = X[l + 1];
  211.                     break;
  212.                 }
  213.             }
  214.             L[W[i].second] = a;
  215.             R[W[i].second] = b;
  216.         }
  217.         forn(i, q) {
  218.             cout << L[i] << ' ' << R[i] << '\n';
  219.         }
  220.         return 0;
  221.     }
  222.     if (oky) {
  223.         forn(i, n) {
  224.             ll l = L[i], k = K[i];
  225.             X.push_back(x);
  226.             Y.push_back(y);
  227.             K.push_back(k);
  228.             x += l;
  229.             y += l * k;
  230.         }
  231.         X.push_back(x);
  232.         K.push_back(0);
  233.         Y.push_back(y);
  234.  
  235.         vector<int> L(q), R(q, X.back());
  236.         ll y = T[0].second;
  237.         {
  238.             vector<pair<ll, pair<int, int> > > E;
  239.             forn(i, q) {
  240.                 E.push_back(mk(T[i].first, mk(1, i)));
  241.             }
  242.             sort(E.begin(), E.end());
  243.             int r = n;
  244.             multiset<pair<double, int> > T, B;
  245.             multiset<int> G;
  246.             for (int i = q - 1; i >= 0; i--) {
  247.                 ll x = E[i].first;
  248.                 while (r >= 0 && X[r] >= x) {
  249.                     if (K[r] == 0) {
  250.                         if(y < Y[r])
  251.                             G.insert(X[r]);
  252.                     }
  253.                     else {
  254.                         double t = X[r] + 1.0 * (y - Y[r]) / K[r];
  255.                         if (K[r] > 0) {
  256.                             T.insert(mk(t, X[r]));
  257.                             G.insert(X[r]);
  258.                         }
  259.                         else {
  260.                             B.insert(mk(t, X[r]));
  261.                         }
  262.                     }
  263.                     r--;
  264.                 }
  265.                 while (T.size() ) {
  266.                     auto t = T.end();
  267.                     t--;
  268.                     if (t->first < x)
  269.                         break;
  270.                     G.erase(G.find(t->second));
  271.                     T.erase(t);
  272.                 }
  273.                 while (B.size()) {
  274.                     auto t = B.end();
  275.                     t--;
  276.                     if (t->first <= x)
  277.                         break;
  278.                     G.insert(t->second);
  279.                     B.erase(t);
  280.                 }
  281.                 if (G.size()) {
  282.                     R[E[i].second.second] = *G.begin();
  283.                 }
  284.             }
  285.         }
  286.  
  287.         {
  288.             vector<pair<ll, pair<int, int> > > E;
  289.             forn(i, q) {
  290.                 E.push_back(mk(T[i].first, mk(1, i)));
  291.             }
  292.             sort(E.begin(), E.end());
  293.             int r = 0;
  294.             multiset<pair<double, int> > T, B;
  295.             multiset<int> G;
  296.             for (int i = 0; i < q; i++) {
  297.                 ll x = E[i].first;
  298.                 while (r < n && X[r + 1] <= x) {
  299.                     if (K[r] == 0) {
  300.                         if (y < Y[r])
  301.                             G.insert(X[r + 1]);
  302.                     }
  303.                     else {
  304.                         double t = X[r] + 1.0 * (y - Y[r]) / K[r];
  305.                         if (K[r] < 0) {
  306.                             T.insert(mk(t, X[r + 1]));
  307.                             G.insert(X[r + 1]);
  308.                         }
  309.                         else {
  310.                             B.insert(mk(t, X[r + 1]));
  311.                         }
  312.                     }
  313.                     r++;
  314.                 }
  315.                 while (T.size()) {
  316.                     auto t = T.begin();
  317.                     if (t->first > x)
  318.                         break;
  319.                     G.erase(G.find(t->second));
  320.                     T.erase(t);
  321.                 }
  322.                 while (B.size()) {
  323.                     auto t = B.begin();
  324.                     if (t->first >= x)
  325.                         break;
  326.                     G.insert(t->second);
  327.                     B.erase(t);
  328.                 }
  329.                 if (G.size()) {
  330.                     L[E[i].second.second] = *G.rbegin();
  331.                 }
  332.             }
  333.         }
  334.         forn(i, q) {
  335.             cout << L[i] << ' ' << R[i] << '\n';
  336.         }
  337.         return 0;
  338.     }
  339. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement