#include <bits/stdc++.h>
using
namespace
std;
int
lbound(vector<pair<
int
,
int
> >& arr,
int
& target)
{
int
low = 0, high = (
int
)arr.size() - 1;
int
ans = -1;
while
(low <= high) {
int
mid = (low + high) / 2;
int
avg = (arr[mid].first
+ arr[mid].second)
/ 2;
if
(avg <= target)
low = mid + 1;
else
{
high = mid - 1;
ans = mid;
}
}
if
(ans == -1)
return
-1;
int
avg = (arr[ans].first
+ arr[ans].second)
/ 2;
if
(avg > target)
return
ans;
return
-1;
}
bool
compare(pair<
int
,
int
>& a,
pair<
int
,
int
>& b)
{
int
val1 = (a.first + a.second) / 2;
int
val2 = (b.first + b.second) / 2;
return
val1 <= val2;
}
void
findPair(vector<pair<
int
,
int
> >& arr,
int
N)
{
unordered_map<
int
,
int
> lookUp;
for
(
int
i = 0; i < N; i++) {
lookUp[arr[i].first] = i;
}
sort(arr.begin(), arr.end(), compare);
vector<
int
> ans(N);
for
(
int
i = 0; i < N; i++) {
int
target = (arr[i].first
+ arr[i].second)
/ 2;
int
ind = lbound(arr, target);
if
(ind == -1)
ans[lookUp[arr[i].first]] = -1;
else
ans[lookUp[arr[i].first]]
= lookUp[arr[ind].first];
}
for
(
auto
x : ans)
cout << x <<
' '
;
}
int
main()
{
vector<pair<
int
,
int
> > arr
= { { 2, 3 }, { 1, 3 }, { 3, 4 } };
int
N = arr.size();
findPair(arr, N);
return
0;
}