Hola! Yo en mi caso lo resolví con Fenwick, está en mi lista de pendientes ver un poco Segment Tree, jeje. Pero igual me parecía raro que dividieras por el caso de luchadores de misma y distinta altura. Entonces cambié un par de cosas de tu código y entró (claramente aclaré que no era mío en un comentario).
Nomás saqué la condición y dejé la línea res[sumos[i].id] = st.query(0, sumos[i].h + 1);
. Y por supuesto, como ya no tenés que consultar al anterior por la condición, no hace falta separar el caso 0 y empezar el for en 1, por lo que directamente lo cambié en un forn(i, n)
.
Lo único que se me ocurre que podía estar pasando, es que la forma en que armaste el Segment Tree (repito que si bien entiendo cómo funcionan, no lo he aplicado aún en código), al devolver los valores para cierto luchador necesitás consultar por sumos[i].h + 1
, y con la condición te podías estar salteando luchadores que uno superaba por tener igual peso y altura.
EDIT: El enunciado dice que no deberían haber luchadores de ambas medidas. Por lo tanto no sé entonces qué puede ser (abajo puse un comentario aparte).
Así funcionó:
Tu código 100/100
#define forn(i, n) for(int i = 0; i < n; i++)
#define fori(i, a, n) for(int i = a; i < n; i++)
#define forrt(i, n) for(int i = n; i >= 0; i--);
using namespace std;
const int MAXN = 100010, MAXPH = 11000010;
/*
ESTE NO ES MI CÓDIGO. ESTOY PROBANDO EL CÓDIGO DEL USER JoacruYT
PARA EL POST http://foro.oia.unsam.edu.ar/t/luchadores-japoneses/521/6
*/
struct segtree{
int n, *st;
segtree(int t){
n = 2 * pow(2, ceil(log2(t))) - 1;
st = new int[n];
forn(i, n) st[i] = 0;
}
int query(int qi, int qd, int si, int sd, int index){
if(qi >= sd || qd <= si) return 0;
if(si >= qi && sd <= qd) return st[index];
int m = (si + sd) / 2;
return query(qi, qd, si, m, index * 2 + 1) + query(qi, qd, m, sd, index * 2 + 2);
}
int query(int qi, int qd){
return query(qi, qd, 0, n / 2 + 1, 0);
}
int update(int index){
index += (n / 2);
st[index]++;
while(index > 0){
index = (index - 1) / 2;
st[index] = st[index * 2 + 1] + st[index * 2 + 2];
}
}
};
struct sumo{
int p, h, id;
bool operator < (const sumo &b)const{
if(p == b.p) return h < b.h;
return p < b.p;
}
};
int main(){
ifstream cin("sumo.in");
ofstream cout("sumo.out");
int n, res[MAXN];
sumo sumos[MAXN];
segtree st(MAXPH);
cin>>n;
forn(i, n){
cin>>sumos[i].p>>sumos[i].h;
sumos[i].id = i;
}
sort(sumos, sumos + n);
//res[sumos[0].id] = 0;
//st.update(sumos[0].h);
forn(i, n){
res[sumos[i].id] = st.query(0, sumos[i].h + 1);
st.update(sumos[i].h);
}
forn(i, n) cout<<res[i]<<endl;
return 0;
}