Advertisement
Augenbrauen

xdxd

Jan 19th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define endl '\n'
  5.  
  6. struct Coco
  7. {
  8.     bool czy_odc; //jesli 0 - punkt, jesli 1 - odcinek
  9.     int x, y;
  10.     int y_d, y_g;
  11.     bool czy_kon; // jesli 0 - początek, jesli 1 - koniec
  12.     int indeks;
  13.     int ind_pocz;
  14.     int wynik;
  15. };
  16.  
  17. bool operator< (Coco &a, Coco &b)
  18. {
  19.     if(a.x < b.x)
  20.         return true;
  21.     else if(b.x < a.x)
  22.         return false;
  23.     else
  24.     {
  25.         if(a.y < b.y)
  26.             return true;
  27.         else if(b.y < a.x)
  28.             return false;
  29.         else
  30.         {
  31.             if((a.czy_odc = 1 && a.czy_kon == 0) || (b.czy_odc = 1 && b.czy_kon == 0))
  32.                 return true;
  33.             else if((a.czy_odc = 1 && a.czy_kon == 1) || (b.czy_odc = 1 && b.czy_kon == 1))
  34.                 return false;
  35.         }
  36.     }
  37. }
  38.  
  39. struct Tree
  40. {
  41.     int sz = 1;
  42.     vector<int> t;
  43.     Tree(int n)
  44.     {
  45.         while(sz < n)
  46.             sz *= 2;
  47.         t.resize(2 * sz);
  48.     }
  49.  
  50.     void dodaj(int v)
  51.     {
  52.         v += sz;
  53.         ++t[v];
  54.         v /= 2;
  55.         while(v)
  56.         {
  57.             ++t[v];
  58.             v /= 2;
  59.         }
  60.     }
  61.  
  62.     int suma(int l, int r)
  63.     {
  64.         l += sz;
  65.         r += sz;
  66.         if(l == r)
  67.             return l;
  68.         int sum = t[l] + t[r];
  69.         while(l / 2 != r / 2)
  70.         {
  71.             if(l % 2 == 1)
  72.                 sum += t[l + 1];
  73.             if(r % 2 == 0)
  74.                 sum += t[r - 1];
  75.             l /= 2;
  76.             r /= 2;
  77.         }
  78.         return sum;
  79.     }
  80. };
  81.  
  82. int main()
  83. {
  84.     ios_base::sync_with_stdio(0);
  85.     cin.tie();
  86.  
  87.     int n, k;
  88.     cin >> n >> k;
  89.     vector<Coco> v(n + 2 * k);
  90.     for(int i = 0; i < n; ++i)
  91.     {
  92.         cin >> v[i].x >> v[i].y;
  93.         v[i].czy_odc = 0;
  94.  
  95.     }
  96.     for(int i = 0, j = 0; i < 2 * k, j < k; i += 2, ++j)
  97.     {
  98.         cin >> v[n + i].x >> v[n + i].y >> v[n + i + 1].x >> v[n + 1 + i].y;
  99.         v[n + i].czy_odc = 1;
  100.         v[n + i].czy_kon = 0;
  101.         v[n + i + 1].czy_odc = 1;
  102.         v[n + i + 1].czy_kon = 1;
  103.         v[n + i].y_d = v[n + i + 1].y_d = v[n + i].y;
  104.         v[n + i].y_g = v[n + i + 1].y_g = v[n + i + 1].y;  
  105.         v[n + i].indeks = v[n + i + 1].indeks = i / 2; 
  106.         v[n + i + 1].ind_pocz = n + i;
  107.     }
  108.     sort(v.begin(), v.end());
  109.     Tree t(1e6 + 1);
  110.     vector<int> answ(k);
  111.     for(int i = 0; i < n + 2 * k; ++i)
  112.     {
  113.         if(v[i].czy_odc == 0)
  114.             t.dodaj(v[i].y);
  115.         else
  116.         {
  117.             v[i].wynik = t.suma(v[i].y_d, v[i].y_g);
  118.             if(v[i].czy_kon == 0)
  119.                 continue;
  120.             else
  121.                 answ[v[i].indeks] = v[i].wynik - v[v[i].ind_pocz].wynik;
  122.         }
  123.  
  124.     }
  125.     for(int &i : answ)
  126.         cout << i << endl;
  127.  
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement