#include #include #include using namespace std; struct pt { int x,y; int id; }; struct query { int tp; int x,y; }; const int MAXN = 100000; int n; query queries[MAXN+111]; pt pts[MAXN+111]; const int INF = 1000000000; struct node { bool zeroDown = false; int sum = 0; int minVal = INF; }; bool SP(pt A,pt B) { if (A.x != B.x) return A.x < B.x; else return A.y < B.y; } int MIN(int a,int b) { if (a= r) return IT[ver].minVal; else { int mid = (l+r)/2; return MIN(leftMIN(2*ver,l,mid,ind), leftMIN(2*ver+1,mid+1,r,ind)); } } bool addVal(int ver,int l,int r,int ind,int val) { Refresh(ver); if (l == r) { if (l == ind) { Change(ver); IT[ver].minVal = val; IT[ver].sum = 1; return false; } else { if (IT[ver].minVal < val) { return true; } else { Change(ver); IT[ver].minVal = INF; IT[ver].sum = 0; return false; } } } int mid = (l+r)/2; bool ans; if (ind < l) { if (IT[ver].minVal > val) { Change(ver); IT[ver].zeroDown = true; Refresh(ver); return false; } else { ans = addVal(2*ver,l,mid,ind,val); if (!ans) { ans = addVal(2*ver+1,mid+1,r,ind,val); } } } else if (ind <= mid) { ans = addVal(2*ver,l,mid,ind,val); if (!ans) { ans = addVal(2*ver+1,mid+1,r,ind,val); } } else ans = addVal(2*ver+1,mid+1,r,ind,val); Refresh(2*ver); Refresh(2*ver+1); Change(ver); IT[ver].sum = IT[2*ver].sum + IT[2*ver+1].sum; IT[ver].minVal = MIN(IT[2*ver].minVal, IT[2*ver+1].minVal); /*if (IT[ver].sum < 0) { cout<<"noperino "< l) addTower(queries[l].y, qID[l]); if (IT[1].sum < 0) { cout<<"NO at "< r) { addTower(queries[i].y, qID[i]); } } DaQ(mid+1,r); revertBack(s); L = s; curDepth--; return; } int main() { freopen("towers.in","r",stdin); freopen("towers.out","w",stdout); int i,j; int x1,y1; int curID = 0; scanf("%d",&n); LEAFOFFSET=1; while(LEAFOFFSET