#include<bits/stdc++.h>
using namespace std;
const long long N=2e6+5,INF=1e18;
long long n,ans;
long long a[N],b[N];
long long v[N],vid;
long long f[N*4],g[N*4];
multiset <long long> S[N*4];
void build(long long l,long long r,long long o){
if(l==r){
f[o]=INF;
g[o]=l;
return ;
}
long long mid=(l+r)>>1;
build(l,mid,o<<1);
build(mid+1,r,o<<1|1);
if(f[o<<1]<=f[o<<1|1]) f[o]=f[o<<1],g[o]=g[o<<1];
else f[o]=f[o<<1|1],g[o]=g[o<<1|1];
}
void modify(long long l,long long r,long long o,long long x,long long k){
if(l==r){
f[o]=min(f[o],k);
S[o].insert(k);
return ;
}
long long mid=(l+r)>>1;
if(x<=mid) modify(l,mid,o<<1,x,k);
else modify(mid+1,r,o<<1|1,x,k);
if(f[o<<1]<=f[o<<1|1]) f[o]=f[o<<1],g[o]=g[o<<1];
else f[o]=f[o<<1|1],g[o]=g[o<<1|1];
}
void del(long long l,long long r,long long o,long long x,long long k){
if(l==r){
S[o].erase(S[o].find(k));
if(!S[o].size()) f[o]=INF;
else f[o]=*(--S[o].end());
return ;
}
long long mid=(l+r)>>1;
if(x<=mid) del(l,mid,o<<1,x,k);
else del(mid+1,r,o<<1|1,x,k);
if(f[o<<1]<=f[o<<1|1]) f[o]=f[o<<1],g[o]=g[o<<1];
else f[o]=f[o<<1|1],g[o]=g[o<<1|1];
}
long long mn,mner;
void query(long long l,long long r,long long o,long long L,long long R){
if(L<=l && r<=R){
if(f[o]<mn) mn=f[o],mner=g[o];
return ;
}
long long mid=(l+r)>>1;
if(L<=mid) query(l,mid,o<<1,L,R);
if(R>mid) query(mid+1,r,o<<1|1,L,R);
}
priority_queue <long long> Q;
long long c[N];
long long lowbit(long long x){
return x & (-x);
}
void modi(long long x,long long k){
while(x<=vid) c[x]+=k,x+=lowbit(x);
}
long long que(long long x){
long long tot=0;
while(x) tot+=c[x],x-=lowbit(x);
return tot;
}
multiset <long long> T;
int main(){
cin>>n;
for(long long i=1;i<=n;i++) cin>>a[i]>>b[i],v[++vid]=a[i],v[++vid]=b[i];
sort(v+1,v+vid+1);
vid=unique(v+1,v+vid+1)-v-1;
build(1,vid,1);
for(long long i=1;i<=n;i++){
a[i]=lower_bound(v+1,v+vid+1,a[i])-v;
b[i]=lower_bound(v+1,v+vid+1,b[i])-v;
if(a[i]>=b[i]) modify(1,vid,1,a[i],b[i]),ans++;
else Q.push(b[i]),modi(a[i],1),T.insert(a[i]);
}
while(Q.size()){
long long u=Q.top(); Q.pop();
long long x=que(vid)-que(u-1);
if(x){
long long p=*(--T.end());
T.erase(T.find(p));
modi(p,-1);
}
else{
mn=INF;
query(1,vid,1,u,vid);
if(mn==INF) return puts("-1"),0;
del(1,vid,1,mner,mn);
ans--;
Q.push(mn);
}
}
cout<<ans;
}