// Test of closest pair algorithms
// David Eppstein, UC Irvine, 19 Apr 1997
//
// Quadtree closest pair algorithm
// Maintains a quadtree over the distance matrix; closest pair = quadtree root
//
// Total space: 16/3 n^2 + O(n) bytes
// Time per insertion or single distance update: O(Dn)
// Time per deletion or point update: O(n)
// Time per closest pair: O(log n)

#include "ClosestPairs.h"
#include "PointSet.h"

class QuadTreeCP : public ClosestPairs {
 	double * distances;
 	PointSet * parent_dist;
 	QuadTreeCP * parent;
 	int * active;
 	unsigned long maxpts;
 	Distance & dist;
 	
 	// two halves of UpdatePoint, separate because recursion is a little diff
 	void UpdateRow(point);
 	void UpdateCol(point);

 public:
 	~QuadTreeCP();
 	QuadTreeCP(long np, long mp, Distance & d);
 	void operator += (point);
 	void operator -= (point);
 	double operator () (point & a, point & b);
 	void UpdatePoint(point);
 	void UpdateDistance(point,point);
};
