Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- struct sumo
- {
- int peso, altura, id;
- };
- bool operator<(const sumo &a, const sumo &b)
- {
- if(a.peso < b.peso)
- return true;
- if(a.peso > b.peso)
- return false;
- return a.altura < b.altura;
- }
- int val[11000001];
- void comprimir(vector <sumo> &s)
- {
- for(int i=0; i<s.size(); i++)
- val[s[i].altura] = 1;
- for(int i=1; i<=11000000; i++)
- val[i] += val[i-1];
- for(int i=0; i<s.size(); i++)
- s[i].altura = val[s[i].altura];
- }
- int ST[300000];
- int leftmost[300000];
- int res[100000];
- int n;
- int sigPot2(int x)
- {
- int p = 1;
- while(x > p)
- p*=2;
- return p;
- }
- void update(int nodo, int val)
- {
- ST[nodo] += val;
- nodo >>= 1;
- while(nodo > 0)
- {
- ST[nodo] = ST[nodo<<1]+ST[1 | (nodo<<1)];
- nodo>>=1;
- }
- }
- int L, R;
- int query(const int &nodo)
- {
- if(R < leftmost[nodo] || ST[nodo] == 0)
- return 0;
- if(L <= nodo)
- return ST[nodo];
- int r = query(nodo<<1);
- r += query(1 | (nodo<<1));
- return r;
- }
- int main()
- {
- ios::sync_with_stdio(false);
- ifstream in("sumo.in");
- ofstream out("sumo.out");
- in >> n;
- vector <sumo> s(n);
- for(int i=0; i<n; i++)
- {
- in >> s[i].peso >> s[i].altura;
- //scanf("%d %d", &s[i].peso, &s[i].altura);
- s[i].id = i;
- }
- comprimir(s);
- sort(s.begin(), s.end());
- n = sigPot2(n);
- for(int i=0; i<s.size(); i++)
- ST[n+s[i].altura]++;
- for(int i=n; i<2*n; i++)
- leftmost[i] = i;
- for(int i=n-1; i>=0; i--)
- ST[i] = ST[i*2]+ST[i*2+1];
- for(int i=n-1; i>=0; i--)
- leftmost[i] = leftmost[i*2];
- for(int i=s.size()-1; i>=0; i--)
- {
- update(n+s[i].altura, -1);
- L = n;
- R = n+s[i].altura;
- res[s[i].id] = query(1);
- }
- for(int i=0; i<s.size(); i++)
- {
- out << res[i] << '\n';
- //printf("%d\n", res[i]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment