Advertisement
Ikmik

Поезд пассаЖирный

Jun 22nd, 2015
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <map>
  4. #include <cassert>
  5. #include <algorithm>
  6. #include <deque>
  7.  
  8. using namespace std;
  9.  
  10. typedef struct stree* pSTree;
  11.  
  12. struct stree
  13. {
  14.     long long x;
  15.     pSTree L, R;
  16.     stree(int _x)
  17.     {
  18.         x = _x;
  19.         L = nullptr;
  20.         R = nullptr;
  21.     }
  22.     stree(pSTree p)
  23.     {
  24.         x = p->x;
  25.         L = p->L;
  26.         R = p->R;
  27.     }
  28. };
  29.  
  30. pSTree build(int L, int R)
  31. {
  32.     pSTree v = new stree(0);
  33.     if (L == R - 1)
  34.         return v;
  35.     int mid = (L + R) / 2;
  36.     v->L = build(L, mid);
  37.     v->R = build(mid, R);
  38.     return v;
  39. }
  40.  
  41. int get_x(pSTree v)
  42. {
  43.     if (v)
  44.         return v->x;
  45.     return -1;
  46. }
  47.  
  48. pSTree update(pSTree v, int L, int R, int x, long long y)
  49. {
  50.     if (L > x || R <= x)
  51.         return v;
  52.     else if (L == R - 1)
  53.         return new stree(y);
  54.     int mid = (L + R) / 2;
  55.     pSTree new_v = new stree(v);
  56.     new_v->L = update(new_v->L, L, mid, x, y);
  57.     new_v->R = update(new_v->R, mid, R, x, y);
  58.     new_v->x = max(get_x(new_v->L), get_x(new_v->R));
  59.     return new_v;
  60. }
  61.  
  62. long long get_minimal(pSTree v, int L, int R, long long b)
  63. {
  64.     if (get_x(v) < b)
  65.         return -1;
  66.     if (L == R - 1)
  67.         return L;
  68.     int mid = (L + R) / 2;
  69.     if (get_x(v->L) >= b)
  70.         return get_minimal(v->L, L, mid, b);
  71.     else
  72.         return get_minimal(v->R, mid, R, b);
  73. }
  74.  
  75. struct ticket
  76. {
  77.     int c; long long a, b;
  78.     ticket(int _c, int _a, int _b)
  79.     {
  80.         c = _c; a = _a; b = _b;
  81.     }
  82.     bool operator<(const ticket& other) const
  83.     {
  84.         if (a != other.a)
  85.             return a < other.a;
  86.         if (b != other.b)
  87.             return b < other.b;
  88.         return c < other.c;
  89.     }
  90.     ticket() {}
  91. };
  92.  
  93. struct event
  94. {
  95.     long long time; int c; int type;
  96.     event(int _time, int _c, int _type)
  97.     {
  98.         time = _time;
  99.         c = _c;
  100.         type = _type;
  101.     }
  102.     bool operator<(const event& other) const
  103.     {
  104.         if (time != other.time)
  105.             return time < other.time;
  106.         return type < other.type;
  107.     }
  108. };
  109.  
  110. void print(pSTree v, int L, int R)
  111. {
  112.     if (L == R - 1)
  113.         cout << v->x << " ";
  114.     else
  115.     {
  116.         int mid = (L + R) / 2;
  117.         print(v->L, L, mid);
  118.         print(v->R, mid, R);
  119.     }
  120. }
  121.  
  122. int main()
  123. {
  124.     int n, s, m;
  125.     cin >> n >> s >> m;
  126.     pSTree segment_tree = build(0, s);
  127.     vector<event> events;
  128.     vector<deque<ticket> > deques(s);
  129.     vector<ticket> tickets;
  130.     for (int i = 0; i < m; i++)
  131.     {
  132.         int c; long long a, b;
  133.         cin >> c >> a >> b;
  134.         c--; //b--;
  135.         events.push_back(event(a, c, 1));
  136.         events.push_back(event(b, c, -1));
  137.         tickets.push_back(ticket(c, a, b));
  138.     }
  139.     sort(events.begin(), events.end());
  140.     sort(tickets.begin(), tickets.end());
  141.     for (int i = 0; i < m; i++)
  142.         deques[tickets[i].c].push_back(tickets[i]);
  143.     for (int i = 0; i < s; i++)
  144.     {
  145.         deques[i].push_back(ticket(i, 1791791791, 1791791792));  
  146.         segment_tree = update(segment_tree, 0, s, i, deques[i].front().a);
  147.     }
  148.     map<int, pSTree> strees;
  149.     strees[0] = segment_tree;
  150.     if (m)
  151.     {
  152.         int lst = events[0].time;
  153.         for (int i = 0; i < 2 * m; i++)
  154.         {
  155.             if (events[i].time != lst)
  156.                 strees[lst] = segment_tree;
  157.             if (events[i].type == 1)
  158.             {
  159.                 segment_tree = update(segment_tree, 0, s, events[i].c, -1);
  160.                 deques[events[i].c].pop_front();
  161.             }
  162.             else
  163.                 segment_tree = update(segment_tree, 0, s, events[i].c, deques[events[i].c].front().a);
  164.             lst = events[i].time;
  165.         }
  166.         strees[lst] = segment_tree;
  167.     }
  168.     else
  169.         strees[0] = segment_tree;
  170.     strees[1791791791] = segment_tree;
  171.     long long p = 0;
  172.     int q;
  173.     cin >> q;
  174.     for (int i = 0; i < q; i++)
  175.     {
  176.         long long x, y;
  177.         cin >> x >> y;
  178.         x += p; y += p;
  179.         if (x < 1 || y > n)
  180.             p = 0;
  181.         else
  182.         {
  183.             auto it = strees.upper_bound(x);
  184.             it--;
  185.             pSTree needed = it->second;
  186.             p = get_minimal(needed, 0, s, y) + 1;
  187.         }
  188.         cout << p << endl;
  189.     }
  190.     return 0;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement