#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<map>
#include<set>
#include<limits>
#include<climits>
#include<cmath>
#include<functional>
#include<ctime>
#include<cstdlib>
#include<fstream>
#include<typeinfo>

using namespace std;

typedef long long int ll;
typedef unsigned long long int u64;
typedef unsigned u32;

struct bit
{
    int a[1<<17];
    void Initialize()
    {
        memset(a,0,sizeof(a));
    }
    void Update(int pos, int val)
    {
        for(;pos<=100000;pos+=pos&(-pos))
            a[pos]+=val;
    }
    int Query(int pos)
    {
        int ans=0;
        for(;pos>=1;pos-=pos&(-pos))
            ans+=a[pos];
        return ans;
    }
}it;

struct coder
{
    int a,h,number;
    coder(){}
    coder(int x, int y)
    {
        a=x;
        h=y;
    }
    bool operator<(const coder &x) const
    {
        if(a<x.a)
            return true;
        if(a>x.a)
            return false;
        return h<x.h;
    }
    bool operator==(const coder &x) const
    {
        return (a==x.a && h==x.h);
    }
};

map <coder,int> m;
coder a[1<<19];
int ans[1<<19];
int n;

void input()
{
    scanf("%d", &n);
    int i;
    for(i=1;i<=n;i++)
    {
        scanf("%d %d", &a[i].a, &a[i].h);
        a[i].number=i;
    }
}

void solve()
{
    it.Initialize();
    sort(a+1,a+1+n);
    int i;
    for(i=1;i<=n;i++)
    {
        ans[a[i].number]=it.Query(a[i].h)-m[a[i]];
        m[a[i]]++;
        it.Update(a[i].h,1);
    }
    for(i=1;i<=n;i++)
        printf("%d\n", ans[i]);
}

int main()
{
    input();
    solve();
    return 0;
}
