#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define f first
#define s second
#define PI acos(-1)
#define CS ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
int mn[1 << 22],mx[1 << 22],lazy[1 << 22];
void propagate(int i,int l,int r)
{
if(!lazy[i])return;
mn[i]+=lazy[i];
mx[i]+=lazy[i];
if(l!=r)
{
lazy[i*2]+=lazy[i];
lazy[i*2+1]+=lazy[i];
}
lazy[i]=0;
}
void update(int i,int l,int r,int a,int b,int v)
{
propagate(i,l,r);
if(l>b || r<a)return;
if(l>=a & r<=b)
{
lazy[i]+=v;
propagate(i,l,r);
return;
}
int mid = (l+r) >>1;
update(i*2, l,mid,a,b,v);
update(i*2 +1, mid+1,r,a,b,v);
mn[i]=min(mn[i*2],mn[i*2+1]);
mx[i]=max(mx[i*2],mx[i*2+1]);
}
int getMin(int i,int l,int r,int a,int b)
{
propagate(i,l,r);
if(l>b|| r<a)return 1e9;
if(l>=a &&r<=b)return mn[i];
int mid=(l+r)>>1;
return min(getMin(i*2,l,mid,a,b),getMin(i*2+1,mid+1,r,a,b));
}
int getMax(int i,int l,int r,int a,int b)
{
propagate(i,l,r);
if(l>b|| r<a)return -1e9;
if(l>=a &&r<=b)return mx[i];
int mid=(l+r)>>1;
return max(getMax(i*2,l,mid,a,b),getMax(i*2+1,mid+1,r,a,b));
}
struct Rect
{
//top lef=(x1,y1) , bottom rihjt =(x2,y2)
int x1,x2,y1,y2;
Rect(int x11,int x22,int y11,int y22)
{
x1=x11;
y1=y11;
x2=x22;
y2=y22;
}
};
vector<Rect>rects;
void compress()
{
map<int,int>xs,ys;
for(int i=0; i<rects.size(); i++)
{
xs[rects[i].x1]=0;
xs[rects[i].x2]=0;
ys[rects[i].y1]=0;
ys[rects[i].y2]=0;
}
int tmp=1;
for(map<int,int>::iterator it = xs.begin(); it!=xs.end(); it++)
it->s=tmp++;
tmp=1;
for(map<int,int>::iterator it = ys.begin(); it!=ys.end(); it++)
it->s=tmp++;
for(int i=0; i<rects.size(); i++)
{
rects[i].x1=xs[rects[i].x1];
rects[i].x2=xs[rects[i].x2];
rects[i].y1=ys[rects[i].y1];
rects[i].y2=ys[rects[i].y2];
}
}
bool comp(Rect a,Rect b)
{
return a.y1<b.y1;
}
bool doubleBorder(int x1,int x2)
{
if(abs(getMin(1,0,(1<<19),x1,x1)-getMin(1,0,(1<<19),x1-1,x1-1))>1)return 1;
if(abs(getMin(1,0,(1<<19),x2,x2)-getMin(1,0,(1<<19),x2+1,x2+1))>1)return 1;
return 0;
}
bool sweep()
{
sort(rects.begin(),rects.end(),comp);
memset(lazy,0,sizeof lazy);
memset(mx,0,sizeof mx);
memset(mn,0,sizeof mn);
//{y2,{x1,X2}}
set<pair<int,pair<int,int> > >er;
for(int i=0; i<rects.size(); i++)
{
while(er.size()&&er.begin()->f <= rects[i].y1)
{
int x1=er.begin()->s.f,x2=er.begin()->s.s;
update(1, 0, (1 << 19), x1, x2, -1);
if((getMin(1,0,(1<<19),x1,x2)!=getMax(1,0,(1<<19),x1,x2))||
doubleBorder(x1,x2))return 0;
er.erase(er.begin());
}
update(1,0,(1 << 19),rects[i].x1,rects[i].x2,1);
er.insert({rects[i].y2+1,{rects[i].x1,rects[i].x2}});
if((getMin(1,0,(1<<19),rects[i].x1,rects[i].x2)!=getMax(1,0,(1<<19),rects[i].x1,rects[i].x2))||doubleBorder(rects[i].x1,rects[i].x2))return 0;
}
return 1;
}
bool isvalid()
{
compress();
if(!sweep())return 0;
for(int i=0; i<rects.size(); i++)
{
swap(rects[i].x1,rects[i].y1);
swap(rects[i].x2,rects[i].y2);
}
if(!sweep())return 0;
return 1;
}
int main()
{
CS;
int n;
cin>>n;
//{{x,y},indx}
vector<pair<pair<int,int>,int> >a(2*n),input;
for(int i=0; i<2*n; i++)cin>>a[i].f.f>>a[i].f.s, a[i].s=i;
input =a;
sort(a.begin(),a.end());
//{y,indx}
set<pair<int,int> >st;
vector<int>res(n);
for(int i=0; i<2*n; i++)
{
int x=a[i].f.f,y=a[i].f.s,ind=a[i].s;
if(ind < n)
{
st.insert({y,ind});
}
else
{
set<pair<int,int> >::iterator it = st.lower_bound({y,-1});
if(it==st.begin())return cout<<"syntax error", 0;
it--;
res[it->s]=ind;
rects.push_back(Rect(input[it->s].f.f,x,it->f,y));
st.erase(it);
}
}
if(!isvalid())cout<<"syntax error";
else
{
for(int i=0; i<n; i++)cout<<res[i]-n+1<<"\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBmIGZpcnN0CiNkZWZpbmUgcyBzZWNvbmQKI2RlZmluZSBQSSBhY29zKC0xKQojZGVmaW5lIENTIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7Y2luLnRpZSgwKTsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtblsxIDw8IDIyXSxteFsxIDw8IDIyXSxsYXp5WzEgPDwgMjJdOwoKdm9pZCBwcm9wYWdhdGUoaW50IGksaW50IGwsaW50IHIpCnsKICAgIGlmKCFsYXp5W2ldKXJldHVybjsKICAgIG1uW2ldKz1sYXp5W2ldOwogICAgbXhbaV0rPWxhenlbaV07CiAgICBpZihsIT1yKQogICAgewogICAgICAgIGxhenlbaSoyXSs9bGF6eVtpXTsKICAgICAgICBsYXp5W2kqMisxXSs9bGF6eVtpXTsKICAgIH0KICAgIGxhenlbaV09MDsKfQoKdm9pZCB1cGRhdGUoaW50IGksaW50IGwsaW50IHIsaW50IGEsaW50IGIsaW50IHYpCnsKICAgIHByb3BhZ2F0ZShpLGwscik7CiAgICBpZihsPmIgfHwgcjxhKXJldHVybjsKICAgIGlmKGw+PWEgJiByPD1iKQogICAgewogICAgICAgIGxhenlbaV0rPXY7CiAgICAgICAgcHJvcGFnYXRlKGksbCxyKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKGwrcikgPj4xOwogICAgdXBkYXRlKGkqMiwgbCxtaWQsYSxiLHYpOwogICAgdXBkYXRlKGkqMiArMSwgbWlkKzEscixhLGIsdik7CiAgICBtbltpXT1taW4obW5baSoyXSxtbltpKjIrMV0pOwogICAgbXhbaV09bWF4KG14W2kqMl0sbXhbaSoyKzFdKTsKfQoKaW50IGdldE1pbihpbnQgaSxpbnQgbCxpbnQgcixpbnQgYSxpbnQgYikKewogICAgcHJvcGFnYXRlKGksbCxyKTsKICAgIGlmKGw+Ynx8IHI8YSlyZXR1cm4gMWU5OwogICAgaWYobD49YSAmJnI8PWIpcmV0dXJuIG1uW2ldOwogICAgaW50IG1pZD0obCtyKT4+MTsKICAgIHJldHVybiBtaW4oZ2V0TWluKGkqMixsLG1pZCxhLGIpLGdldE1pbihpKjIrMSxtaWQrMSxyLGEsYikpOwp9CgppbnQgZ2V0TWF4KGludCBpLGludCBsLGludCByLGludCBhLGludCBiKQp7CiAgICBwcm9wYWdhdGUoaSxsLHIpOwogICAgaWYobD5ifHwgcjxhKXJldHVybiAtMWU5OwogICAgaWYobD49YSAmJnI8PWIpcmV0dXJuIG14W2ldOwogICAgaW50IG1pZD0obCtyKT4+MTsKICAgIHJldHVybiBtYXgoZ2V0TWF4KGkqMixsLG1pZCxhLGIpLGdldE1heChpKjIrMSxtaWQrMSxyLGEsYikpOwp9CgpzdHJ1Y3QgUmVjdAp7CiAgICAvL3RvcCBsZWY9KHgxLHkxKSAsIGJvdHRvbSByaWhqdCA9KHgyLHkyKQogICAgaW50IHgxLHgyLHkxLHkyOwogICAgUmVjdChpbnQgeDExLGludCB4MjIsaW50IHkxMSxpbnQgeTIyKQogICAgewogICAgICAgIHgxPXgxMTsKICAgICAgICB5MT15MTE7CiAgICAgICAgeDI9eDIyOwogICAgICAgIHkyPXkyMjsKICAgIH0KfTsKCnZlY3RvcjxSZWN0PnJlY3RzOwoKdm9pZCBjb21wcmVzcygpCnsKICAgIG1hcDxpbnQsaW50PnhzLHlzOwogICAgZm9yKGludCBpPTA7IGk8cmVjdHMuc2l6ZSgpOyBpKyspCiAgICB7CiAgICAgICAgeHNbcmVjdHNbaV0ueDFdPTA7CiAgICAgICAgeHNbcmVjdHNbaV0ueDJdPTA7CiAgICAgICAgeXNbcmVjdHNbaV0ueTFdPTA7CiAgICAgICAgeXNbcmVjdHNbaV0ueTJdPTA7CiAgICB9CiAgICBpbnQgdG1wPTE7CiAgICBmb3IobWFwPGludCxpbnQ+OjppdGVyYXRvciBpdCA9IHhzLmJlZ2luKCk7IGl0IT14cy5lbmQoKTsgaXQrKykKICAgICAgICBpdC0+cz10bXArKzsKICAgIHRtcD0xOwogICAgZm9yKG1hcDxpbnQsaW50Pjo6aXRlcmF0b3IgaXQgPSB5cy5iZWdpbigpOyBpdCE9eXMuZW5kKCk7IGl0KyspCiAgICAgICAgaXQtPnM9dG1wKys7CiAgICBmb3IoaW50IGk9MDsgaTxyZWN0cy5zaXplKCk7IGkrKykKICAgIHsKICAgICAgICByZWN0c1tpXS54MT14c1tyZWN0c1tpXS54MV07CiAgICAgICAgcmVjdHNbaV0ueDI9eHNbcmVjdHNbaV0ueDJdOwogICAgICAgIHJlY3RzW2ldLnkxPXlzW3JlY3RzW2ldLnkxXTsKICAgICAgICByZWN0c1tpXS55Mj15c1tyZWN0c1tpXS55Ml07CiAgICB9Cn0KCmJvb2wgY29tcChSZWN0IGEsUmVjdCBiKQp7CiAgICByZXR1cm4gYS55MTxiLnkxOwp9Cgpib29sIGRvdWJsZUJvcmRlcihpbnQgeDEsaW50IHgyKQp7CiAgICBpZihhYnMoZ2V0TWluKDEsMCwoMTw8MTkpLHgxLHgxKS1nZXRNaW4oMSwwLCgxPDwxOSkseDEtMSx4MS0xKSk+MSlyZXR1cm4gMTsKICAgIGlmKGFicyhnZXRNaW4oMSwwLCgxPDwxOSkseDIseDIpLWdldE1pbigxLDAsKDE8PDE5KSx4MisxLHgyKzEpKT4xKXJldHVybiAxOwogICAgcmV0dXJuIDA7Cn0KCmJvb2wgc3dlZXAoKQp7CiAgICBzb3J0KHJlY3RzLmJlZ2luKCkscmVjdHMuZW5kKCksY29tcCk7CiAgICBtZW1zZXQobGF6eSwwLHNpemVvZiBsYXp5KTsKICAgIG1lbXNldChteCwwLHNpemVvZiBteCk7CiAgICBtZW1zZXQobW4sMCxzaXplb2YgbW4pOwoKICAgIC8ve3kyLHt4MSxYMn19CiAgICBzZXQ8cGFpcjxpbnQscGFpcjxpbnQsaW50PiA+ID5lcjsKICAgIGZvcihpbnQgaT0wOyBpPHJlY3RzLnNpemUoKTsgaSsrKQogICAgewogICAgICAgIHdoaWxlKGVyLnNpemUoKSYmZXIuYmVnaW4oKS0+ZiA8PSByZWN0c1tpXS55MSkKICAgICAgICB7CiAgICAgICAgICAgIGludCB4MT1lci5iZWdpbigpLT5zLmYseDI9ZXIuYmVnaW4oKS0+cy5zOwogICAgICAgICAgICB1cGRhdGUoMSwgMCwgKDEgPDwgMTkpLCB4MSwgeDIsIC0xKTsKICAgICAgICAgICAgaWYoKGdldE1pbigxLDAsKDE8PDE5KSx4MSx4MikhPWdldE1heCgxLDAsKDE8PDE5KSx4MSx4MikpfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVCb3JkZXIoeDEseDIpKXJldHVybiAwOwogICAgICAgICAgICBlci5lcmFzZShlci5iZWdpbigpKTsKICAgICAgICB9CgoKICAgICAgICB1cGRhdGUoMSwwLCgxIDw8IDE5KSxyZWN0c1tpXS54MSxyZWN0c1tpXS54MiwxKTsKICAgICAgICBlci5pbnNlcnQoe3JlY3RzW2ldLnkyKzEse3JlY3RzW2ldLngxLHJlY3RzW2ldLngyfX0pOwogICAgICAgIGlmKChnZXRNaW4oMSwwLCgxPDwxOSkscmVjdHNbaV0ueDEscmVjdHNbaV0ueDIpIT1nZXRNYXgoMSwwLCgxPDwxOSkscmVjdHNbaV0ueDEscmVjdHNbaV0ueDIpKXx8ZG91YmxlQm9yZGVyKHJlY3RzW2ldLngxLHJlY3RzW2ldLngyKSlyZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiAxOwp9Cgpib29sIGlzdmFsaWQoKQp7CiAgICBjb21wcmVzcygpOwogICAgaWYoIXN3ZWVwKCkpcmV0dXJuIDA7CiAgICBmb3IoaW50IGk9MDsgaTxyZWN0cy5zaXplKCk7IGkrKykKICAgIHsKICAgICAgICBzd2FwKHJlY3RzW2ldLngxLHJlY3RzW2ldLnkxKTsKICAgICAgICBzd2FwKHJlY3RzW2ldLngyLHJlY3RzW2ldLnkyKTsKICAgIH0KICAgIGlmKCFzd2VlcCgpKXJldHVybiAwOwogICAgcmV0dXJuIDE7Cgp9CmludCBtYWluKCkKewogICAgQ1M7CiAgICBpbnQgbjsKICAgIGNpbj4+bjsKICAgIC8ve3t4LHl9LGluZHh9CiAgICB2ZWN0b3I8cGFpcjxwYWlyPGludCxpbnQ+LGludD4gPmEoMipuKSxpbnB1dDsKICAgIGZvcihpbnQgaT0wOyBpPDIqbjsgaSsrKWNpbj4+YVtpXS5mLmY+PmFbaV0uZi5zLCBhW2ldLnM9aTsKICAgIGlucHV0ID1hOwogICAgc29ydChhLmJlZ2luKCksYS5lbmQoKSk7CiAgICAvL3t5LGluZHh9CiAgICBzZXQ8cGFpcjxpbnQsaW50PiA+c3Q7CiAgICB2ZWN0b3I8aW50PnJlcyhuKTsKICAgIGZvcihpbnQgaT0wOyBpPDIqbjsgaSsrKQogICAgewogICAgICAgIGludCB4PWFbaV0uZi5mLHk9YVtpXS5mLnMsaW5kPWFbaV0uczsKICAgICAgICBpZihpbmQgPCBuKQogICAgICAgIHsKICAgICAgICAgICAgc3QuaW5zZXJ0KHt5LGluZH0pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBzZXQ8cGFpcjxpbnQsaW50PiA+OjppdGVyYXRvciBpdCA9IHN0Lmxvd2VyX2JvdW5kKHt5LC0xfSk7CiAgICAgICAgICAgIGlmKGl0PT1zdC5iZWdpbigpKXJldHVybiBjb3V0PDwic3ludGF4IGVycm9yIiwgMDsKICAgICAgICAgICAgaXQtLTsKICAgICAgICAgICAgcmVzW2l0LT5zXT1pbmQ7CiAgICAgICAgICAgIHJlY3RzLnB1c2hfYmFjayhSZWN0KGlucHV0W2l0LT5zXS5mLmYseCxpdC0+Zix5KSk7CiAgICAgICAgICAgIHN0LmVyYXNlKGl0KTsKICAgICAgICB9CiAgICB9CgogICAgaWYoIWlzdmFsaWQoKSljb3V0PDwic3ludGF4IGVycm9yIjsKICAgIGVsc2UKICAgIHsKICAgICAgICBmb3IoaW50IGk9MDsgaTxuOyBpKyspY291dDw8cmVzW2ldLW4rMTw8IlxuIjsKICAgIH0KICAgIHJldHVybiAwOwp9