Advertisement
Augenbrauen

karty

Feb 4th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define endl '\n'
  5.  
  6. struct Node
  7. {
  8.     bool xx, xy, yx, yy;
  9.     int x_p, y_p, x_k, y_k;
  10.  
  11.    
  12. };
  13.  
  14. Node operator+ (Node &a, Node &b)
  15. {
  16.     Node wynik;
  17.  
  18.     wynik.x_p = a.x_p;
  19.     wynik.x_k = b.x_k;
  20.     if(a.x_k <= b.x_p)
  21.         wynik.xx = true;
  22.     else
  23.         wynik.xx = false;
  24.  
  25.     wynik.x_p = a.x_p;
  26.     wynik.y_k = b.y_k;
  27.     if(a.y_k <= b.x_p)
  28.             wynik.xy = true;
  29.     else
  30.         wynik.xy = false;
  31.  
  32.     wynik.y_p = a.y_p;
  33.     wynik.x_k = b.x_k;
  34.     if(a.x_k <= b.y_p)
  35.         wynik.yx = true;
  36.     else
  37.         wynik.yx = false;
  38.  
  39.     wynik.y_p = a.y_p;
  40.     wynik.y_k = b.y_k;
  41.     if(a.y_k <= b.y_p)
  42.         wynik.yy = true;
  43.     else
  44.         wynik.yy = false;
  45.  
  46.     return wynik;
  47. }
  48.  
  49.  
  50. struct Tree
  51. {
  52.     int sz = 1;
  53.     vector<Node> t;
  54.     Tree(vector<pair<int, int> > &v)
  55.     {
  56.         while(sz < int(v.size()))
  57.             sz *= 2;
  58.         t.resize(sz * 2);
  59.         for(int i = 0; i < int(v.size()); ++i)
  60.         {
  61.             int j = i + sz;
  62.             t[j].xx = t[j].xy = t[j].yx = t[j].yy = true;
  63.             t[j].x_p = t[j].x_k = t[j].y_p = t[j].y_k = v[i].second;
  64.         }
  65.  
  66.         if(v.size() * 2 != t.size())
  67.         {
  68.             for(int i = int(v.size()); i < int(t.size()); ++i)
  69.             {
  70.                 int j = i + sz;
  71.                 t[j].xx = t[j].xy = t[j].yx = t[j].yy = true;
  72.                 t[j].x_p = t[j].x_k = t[j].y_p = t[j].y_k = 1e7;
  73.  
  74.             }  
  75.         }
  76.        
  77.         for(int i = sz - 1; i > 0; --i)
  78.         {
  79.             t[i] = t[i * 2] + t[i * 2 + 1];
  80.         }
  81.     }
  82.  
  83.     void zmien(int v, int u)
  84.     {
  85.         v += sz;
  86.         u += sz;
  87.         Node x = t[v];
  88.         t[v] = t[u];
  89.         while(v > 1)
  90.         {
  91.             v /= 2;
  92.             t[v] = t[v * 2] + t[v * 2 + 1];
  93.         }
  94.         t[u] = x;
  95.         while(u > 1)
  96.         {
  97.             u /= 2;
  98.             t[u] = t[u * 2] + t[u * 2 + 1];
  99.         }
  100.  
  101.     }
  102.  
  103.     bool czy_ok()
  104.     {
  105.         if(t[1].xx == 1 || t[1].xy == 1 || t[1].yx == 1 || t[1].yy == 1)
  106.             return 1;
  107.         return 0;
  108.     }
  109. };
  110.  
  111.  
  112. int main()
  113. {
  114.     ios_base::sync_with_stdio(0);
  115.     cin.tie(0);
  116.  
  117.     int n;
  118.     cin >> n;
  119.     vector<pair<int, int> > k(n);
  120.     for(auto &p : k)
  121.         cin >> p.first >> p.second;
  122.     Tree drzewo(k);
  123.  
  124.     int m;
  125.     cin >> m;
  126.     for(int i = 0; i < m; ++i)
  127.     {
  128.         int a, b;
  129.         cin >> a >> b;
  130.         --a;
  131.         --b;
  132.         drzewo.zmien(a, b);
  133.         if(drzewo.czy_ok())
  134.             cout << "TAK" << endl;
  135.         else
  136.             cout << "NIE" << endl;
  137.  
  138.     }
  139.  
  140.  
  141.  
  142.  
  143.  
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement