GastonFontenla

Untitled

Nov 16th, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6.  
  7. struct sumo
  8. {
  9.     int peso, altura, id;
  10. };
  11.  
  12. bool operator<(const sumo &a, const sumo &b)
  13. {
  14.     if(a.peso < b.peso)
  15.         return true;
  16.     if(a.peso > b.peso)
  17.         return false;
  18.     return a.altura < b.altura;
  19. }
  20.  
  21. int val[11000001];
  22.  
  23. void comprimir(vector <sumo> &s)
  24. {
  25.     for(int i=0; i<s.size(); i++)
  26.         val[s[i].altura] = 1;
  27.  
  28.     for(int i=1; i<=11000000; i++)
  29.         val[i] += val[i-1];
  30.  
  31.     for(int i=0; i<s.size(); i++)
  32.         s[i].altura = val[s[i].altura];
  33. }
  34.  
  35. int ST[300000];
  36. int leftmost[300000];
  37. int res[100000];
  38. int n;
  39.  
  40. int sigPot2(int x)
  41. {
  42.     int p = 1;
  43.     while(x > p)
  44.         p*=2;
  45.     return p;
  46. }
  47.  
  48. void update(int nodo, int val)
  49. {
  50.     ST[nodo] += val;
  51.     nodo >>= 1;
  52.     while(nodo > 0)
  53.     {
  54.         ST[nodo] = ST[nodo<<1]+ST[1 | (nodo<<1)];
  55.         nodo>>=1;
  56.     }
  57. }
  58.  
  59. int L, R;
  60.  
  61. int query(const int &nodo)
  62. {
  63.     if(R < leftmost[nodo] || ST[nodo] == 0)
  64.         return 0;
  65.        
  66.     if(L <= nodo)
  67.         return ST[nodo];
  68.  
  69.     int r = query(nodo<<1);
  70.     r += query(1 | (nodo<<1));
  71.     return r;
  72. }
  73.  
  74. int main()
  75. {
  76.     ios::sync_with_stdio(false);
  77.     ifstream in("sumo.in");
  78.     ofstream out("sumo.out");
  79.    
  80.     in >> n;
  81.  
  82.     vector <sumo> s(n);
  83.  
  84.     for(int i=0; i<n; i++)
  85.     {
  86.         in >> s[i].peso >> s[i].altura;
  87.         //scanf("%d %d", &s[i].peso, &s[i].altura);
  88.         s[i].id = i;
  89.     }
  90.  
  91.     comprimir(s);
  92.  
  93.     sort(s.begin(), s.end());
  94.  
  95.     n = sigPot2(n);
  96.  
  97.     for(int i=0; i<s.size(); i++)
  98.         ST[n+s[i].altura]++;
  99.  
  100.     for(int i=n; i<2*n; i++)
  101.         leftmost[i] = i;
  102.  
  103.     for(int i=n-1; i>=0; i--)
  104.         ST[i] = ST[i*2]+ST[i*2+1];
  105.  
  106.     for(int i=n-1; i>=0; i--)
  107.         leftmost[i] = leftmost[i*2];
  108.  
  109.     for(int i=s.size()-1; i>=0; i--)
  110.     {
  111.         update(n+s[i].altura, -1);
  112.         L = n;
  113.         R = n+s[i].altura;
  114.         res[s[i].id] = query(1);
  115.     }
  116.  
  117.     for(int i=0; i<s.size(); i++)
  118.     {
  119.         out << res[i] << '\n';
  120.         //printf("%d\n", res[i]);
  121.     }
  122.  
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment