void connect(int A, int B) { City *paA = cities[A].getPa(), *paB = cities[B].getPa(); if(paA == paB) return; assert(paB->minY <= paB->maxY); if(paB->minY != paB->maxY) { tree1.Add(-1, paB->minY, paB->maxY - 1); tree2.Add(-paB->size, paB->minY, paB->maxY - 1); } if(paA->minY != paA->maxY) { tree1.Add(-1, paA->minY, paA->maxY - 1); tree2.Add(-paA->size, paA->minY, paA->maxY - 1); } paA->size += paB->size; paB->ppa = paA; paA->minY = min(paA->minY, paB->minY); paA->maxY = max(paA->maxY, paB->maxY); assert(paA->minY <= paA->maxY); if(paA->minY != paA->maxY) { tree1.Add(1, paA->minY, paA->maxY - 1); tree2.Add(paA->size, paA->minY, paA->maxY - 1); } }