ThegeekKnight16

Movie Festival Queries

Jun 13th, 2022 (edited)
171
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. using namespace std;
  3. const int MAXN = 2e5 + 10;
  4. const int MAXK = 30;
  5. int pai[MAXN];
  6. int dp[MAXN][MAXK];
  7. struct filme
  8. {
  9.     int L, R;
  10.    
  11.     filme(int left, int right) {L = left; R = right;}
  12.    
  13.     bool operator<(filme outro)
  14.     {
  15.         if (R == outro.R) return L > outro.L;
  16.         return R < outro.R;
  17.     }
  18. };
  19. vector<filme> Filmes;
  20. vector<filme> Uteis;
  21.  
  22. int BUSCA_BINARIA(int val, int N)
  23. {
  24.     int ini = 0; int fim = N;
  25.     if (val > Uteis[fim].L) return -1;
  26.     while (ini < fim)
  27.     {
  28.         int m = (ini + fim) / 2;
  29.         if (Uteis[m].L >= val) fim = m;
  30.         else ini = m+1;
  31.     }
  32.     return fim;
  33. }
  34.  
  35. int main()
  36. {
  37.     ios_base::sync_with_stdio(false);
  38.     cin.tie(NULL);
  39.     int N, Q;
  40.     cin >> N >> Q;
  41.     for (int i = 0; i < N; i++)
  42.     {
  43.         int X, Y;
  44.         cin >> X >> Y;
  45.         Filmes.emplace_back(X, Y);
  46.     }
  47.     sort(Filmes.begin(), Filmes.end());
  48.     int ultL = -1;
  49.     for (int i = 0; i < Filmes.size(); i++)
  50.     {
  51.         if (Filmes[i].L <= ultL) continue;
  52.         ultL = Filmes[i].L;
  53.         Uteis.push_back(Filmes[i]);
  54.     }
  55.  
  56.     Uteis.emplace_back(1e9 + 10, 1e9 + 10);
  57.     pai[Uteis.size()-1] = Uteis.size()-1;
  58.  
  59.     for (int i = 0; i < Uteis.size(); i++)
  60.     {
  61.         int id = BUSCA_BINARIA(Uteis[i].R, Uteis.size()-2);
  62.         if (id == -1) pai[i] = Uteis.size()-1;
  63.         else pai[i] = id;
  64.     }
  65.     for (int i = 0; i < Uteis.size(); i++)
  66.     {
  67.         dp[i][0] = pai[i];
  68.     }
  69.     for (int k = 1; k < MAXK; k++)
  70.     {
  71.         for (int i = 0; i < Uteis.size(); i++)
  72.         {
  73.             dp[i][k] = dp[ dp[i][k-1] ][k-1];
  74.         }
  75.     }
  76.  
  77.     for (int q  = 0; q < Q; q++)
  78.     {
  79.         int A, B;
  80.         cin >> A >> B;
  81.         A = BUSCA_BINARIA(A, Uteis.size()-2);
  82.         if (A == -1) {cout << "0" << '\n'; continue;}
  83.         int resp = 0;
  84.         if (B >= Uteis[A].R) resp++;
  85.         else
  86.         {
  87.             cout << "0" << '\n';
  88.             continue;
  89.         }
  90.         for (int k = MAXK-1; k >= 0; k--)
  91.         {
  92.             if (Uteis[dp[A][k]].R > B) continue;
  93.             resp += (1 << k);
  94.             A = dp[A][k];
  95.         }
  96.         cout << resp << '\n';
  97.     }
  98. }
  99.  
Add Comment
Please, Sign In to add comment