/* Problem C
 * input file mobile.txt
 *
 * goal:
 * to find the total covered area given a set of square
 *
 * methodology:
 * for each square, we find that area that is not overlap with the previous squares and add it
 * when a square is found overlapped with previous squares, we break down the the square to rectangles
 * base on the 16 possible case of overlap, then recursively compute the non-overlapping area of
 * that rectangle with othe squares.
 * 
 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

class Rectangle {
public:
	float minx,miny,maxx,maxy;
	
	Rectangle (float x, float y, float r) {
		minx=x-r;
		miny=y-r;
		maxx=x+r;
		maxy=y+r;
		//printf ("%f %f %f %f\n",minx,miny,maxx,maxy);
	}
	
	Rectangle (float minx,float miny,float maxx,float maxy) {
		this->minx=minx;
		this->maxx=maxx;
		this->miny=miny;
		this->maxy=maxy;
	}
	
	
	float area() {
		if ((maxx<minx) || (maxy<miny))
			printf("error in rectangle area\n");
		return ((maxx-minx)*(maxy-miny));
	}

};

float non_overlap(Rectangle* income, Rectangle** compare, int no_compare);

float non_overlap(Rectangle* income, Rectangle** compare, int no_compare) {
	float area;
	Rectangle *child1,*child2,*child3,*child4;	
	
	if (no_compare==-1) {
		return (income->area());
	} else {	
		if ((income->minx>=compare[no_compare]->minx) &&
		    (income->maxx<=compare[no_compare]->maxx) &&
		    (income->miny>=compare[no_compare]->miny) &&
		    (income->maxy<=compare[no_compare]->maxy)) {
			// totally overlap
			//printf("total overlap\n");
			return (0);
		} else if ((income->maxx<=compare[no_compare]->minx) ||
		           (income->minx>=compare[no_compare]->maxx) ||
		           (income->maxy<=compare[no_compare]->miny) ||
		           (income->miny>=compare[no_compare]->maxy)) {
			// outside
			//printf("outside\n");
			return (non_overlap(income,compare,no_compare-1));			
		} else if ((income->minx<compare[no_compare]->minx) &&
		           (income->maxx>compare[no_compare]->maxx) &&
		           (income->miny>=compare[no_compare]->miny) &&
		           (income->maxy<=compare[no_compare]->maxy)) {
		    // case 1 overlap
		    //printf("1\n");
		    child1=new Rectangle(income->minx,income->miny,compare[no_compare]->minx,income->maxy);
		    child2=new Rectangle(compare[no_compare]->maxx,income->miny,income->maxx,income->maxy);
		    area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1);
		    delete child1;
		    delete child2;
		    return (area);
		} else if ((income->miny<compare[no_compare]->miny) &&
		           (income->maxy>compare[no_compare]->maxy) &&
		           (income->minx>=compare[no_compare]->minx) &&
		           (income->maxx<=compare[no_compare]->maxx)) {
			// case 2 overlap
			//printf("2\n");
			child1=new Rectangle(income->minx,income->miny,income->maxx,compare[no_compare]->miny);
		    child2=new Rectangle(income->minx,compare[no_compare]->maxy,income->maxx,income->maxy);
		    area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1);
		    delete child1;
		    delete child2;
		    return (area);
		} else if ((income->miny<compare[no_compare]->miny) &&
				   (income->maxy>compare[no_compare]->maxy) &&
				   (income->maxx>compare[no_compare]->maxx) &&
				   (income->minx>=compare[no_compare]->minx)&&
				   (income->minx<compare[no_compare]->maxx)) {
			// case 3 overlap
			//printf("3\n");
			child1=new Rectangle(income->minx,income->miny,income->maxx,compare[no_compare]->miny);
			child2=new Rectangle(compare[no_compare]->maxx,compare[no_compare]->miny,income->maxx,compare[no_compare]->maxy);
			child3=new Rectangle(income->minx,compare[no_compare]->maxy,income->maxx,income->maxy);
			area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1)+non_overlap(child3,compare,no_compare-1);
			delete child1;
			delete child2;
			delete child3;
			return (area);
		} else if ((income->miny<compare[no_compare]->miny) &&
				   (income->maxy>compare[no_compare]->maxy) &&
				   (income->minx<compare[no_compare]->minx) &&
				   (income->maxx>compare[no_compare]->minx) &&
				   (income->maxx<=compare[no_compare]->maxx)) {
			// case 4 overlap
			//printf("4\n");
			child1=new Rectangle(income->minx,income->miny,income->maxx,compare[no_compare]->miny);
			child2=new Rectangle(income->minx,compare[no_compare]->miny,compare[no_compare]->minx,compare[no_compare]->maxy);
			child3=new Rectangle(income->minx,compare[no_compare]->maxy,income->maxx,income->maxy);
			area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1)+non_overlap(child3,compare,no_compare-1);
			delete child1;
			delete child2;
			delete child3;
			return (area);
		} else if ((income->minx<compare[no_compare]->minx) &&
				   (income->maxx>compare[no_compare]->maxx) &&
				   (income->miny<compare[no_compare]->miny) &&
				   (income->maxy>compare[no_compare]->miny) &&
				   (income->maxy<=compare[no_compare]->maxy)) {
			// case 5 overlap
			//printf("5\n");
			child1=new Rectangle(income->minx,income->miny,compare[no_compare]->minx,income->maxy);
			child2=new Rectangle(compare[no_compare]->minx,income->miny,compare[no_compare]->maxx,compare[no_compare]->miny);
			child3=new Rectangle(compare[no_compare]->maxx,income->miny,income->maxx,income->maxy);
			area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1)+non_overlap(child3,compare,no_compare-1);
			delete child1;
			delete child2;
			delete child3;
			return (area);
		} else if ((income->minx<compare[no_compare]->minx) &&
				   (income->maxx>compare[no_compare]->maxx) &&
				   (income->maxy>compare[no_compare]->maxy) &&
				   (income->miny>=compare[no_compare]->miny)&&
				   (income->miny<compare[no_compare]->maxy)) {
			// case 6 overlap
			//printf("6\n");
			child1=new Rectangle(income->minx,income->miny,compare[no_compare]->minx,income->maxy);
			child2=new Rectangle(compare[no_compare]->minx,compare[no_compare]->maxy,compare[no_compare]->maxx,income->maxy);
			child3=new Rectangle(compare[no_compare]->maxx,income->miny,income->maxx,income->maxy);
			area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1)+non_overlap(child3,compare,no_compare-1);
			delete child1;
			delete child2;
			delete child3;
			return (area);
		} else if ((income->minx>=compare[no_compare]->minx) &&
		           (income->maxx<=compare[no_compare]->maxx) &&
		           (income->maxy>compare[no_compare]->maxy) &&
		           (income->miny<compare[no_compare]->maxy) &&
		           (income->miny>=compare[no_compare]->miny)) {
			// case 7 overlap
			//printf("7\n");
			child1=new Rectangle(income->minx,compare[no_compare]->maxy,income->maxx,income->maxy);
			area=non_overlap(child1,compare,no_compare-1);
			delete child1;
			return (area);
		} else if ((income->minx>=compare[no_compare]->minx) &&
		           (income->maxx<=compare[no_compare]->maxx) &&
		           (income->miny<compare[no_compare]->miny) &&
		           (income->maxy>compare[no_compare]->miny) &&
		           (income->maxy<=compare[no_compare]->maxy)) {
			// case 8 overlap
			//printf("8\n");
			child1=new Rectangle(income->minx,income->miny,income->maxx,compare[no_compare]->miny);
			area=non_overlap(child1,compare,no_compare-1);
			delete child1;
			return (area);
		} else if ((income->miny>=compare[no_compare]->miny) &&
		           (income->maxy<=compare[no_compare]->maxy) &&
		           (income->maxx>compare[no_compare]->maxx) &&
		           (income->minx<compare[no_compare]->maxx) &&
		           (income->minx>=compare[no_compare]->minx)) {
			// case 9 overlap
			//printf("9\n");
			child1=new Rectangle(compare[no_compare]->maxx,income->miny,income->maxx,income->maxy);
			area=non_overlap(child1,compare,no_compare-1);
			delete child1;
			return (area);
		} else if ((income->miny>=compare[no_compare]->miny) &&
		           (income->maxy<=compare[no_compare]->maxy) &&
		           (income->minx<compare[no_compare]->minx) &&
		           (income->maxx>compare[no_compare]->minx) &&
		           (income->maxx<=compare[no_compare]->maxx)) {
			// case 10 overlap
			//printf("10\n");
			child1=new Rectangle(income->minx,income->miny,compare[no_compare]->minx,income->maxy);
			area=non_overlap(child1,compare,no_compare-1);
			delete child1;
			return (area);
		} else if ((income->maxx>compare[no_compare]->maxx) &&
		           (income->minx<compare[no_compare]->maxx) &&
		           (income->minx>=compare[no_compare]->minx) &&
		           (income->miny<compare[no_compare]->miny) &&
		           (income->maxy>compare[no_compare]->miny) &&
		           (income->maxy<=compare[no_compare]->maxy)) {
			// case 11 overlap
			//printf("11\n");
			child1=new Rectangle(income->minx,income->miny,income->maxx,compare[no_compare]->miny);
			child2=new Rectangle(compare[no_compare]->maxx,compare[no_compare]->miny,income->maxx,income->maxy);
			area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1);
			delete child1;
			delete child2;
			return (area);
		} else if ((income->maxx>compare[no_compare]->maxx) &&
		           (income->minx<compare[no_compare]->maxx) &&
		           (income->minx>=compare[no_compare]->minx) &&
		           (income->maxy>compare[no_compare]->maxy) &&
		           (income->miny<compare[no_compare]->maxy) &&
		           (income->miny>=compare[no_compare]->miny)) {
			// case 12 overlap
			//printf("12\n");
			child1=new Rectangle(income->minx,compare[no_compare]->maxy,income->maxx,income->maxy);
			child2=new Rectangle(compare[no_compare]->maxx,income->miny,income->maxx,compare[no_compare]->maxy);
			area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1);
			delete child1;
			delete child2;
			return (area);
		} else if ((income->minx<compare[no_compare]->minx) &&
		           (income->maxx>compare[no_compare]->minx) &&
		           (income->maxx<=compare[no_compare]->maxx) &&
		           (income->miny<compare[no_compare]->miny) &&
		           (income->maxy>compare[no_compare]->miny) &&
		           (income->maxy<=compare[no_compare]->maxy)) {
			// case 13 overlap
			//printf("13\n");
			child1=new Rectangle(income->minx,income->miny,income->maxx,compare[no_compare]->miny);
			child2=new Rectangle(income->minx,compare[no_compare]->miny,compare[no_compare]->minx,income->maxy);
			area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1);
			delete child1;
			delete child2;
			return (area);
		} else if ((income->minx<compare[no_compare]->minx) &&
		           (income->maxx>compare[no_compare]->minx) &&
		           (income->maxx<=compare[no_compare]->maxx) &&
		           (income->maxy>compare[no_compare]->maxy) &&
		           (income->miny<compare[no_compare]->maxy) &&
		           (income->miny>=compare[no_compare]->miny)) {
			// case 14 overlap
			//printf("14\n");
			child1=new Rectangle(income->minx,income->miny,compare[no_compare]->minx,compare[no_compare]->maxy);
			child2=new Rectangle(income->minx,compare[no_compare]->maxy,income->maxx,income->maxy);
			area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1);
			delete child1;
			delete child2;
			return (area);
		} else if ((income->maxx>compare[no_compare]->maxx) &&
		           (income->minx<compare[no_compare]->minx) &&
		           (income->maxy>compare[no_compare]->maxy) &&
		           (income->miny<compare[no_compare]->miny)) {
			// case 15 overlap (cover all and greater)
			//printf("15\n");
			child1=new Rectangle(income->minx,income->miny,income->maxx,compare[no_compare]->miny);
			child2=new Rectangle(income->minx,compare[no_compare]->maxy,income->maxx,income->maxy);
			child3=new Rectangle(income->minx,compare[no_compare]->miny,compare[no_compare]->minx,compare[no_compare]->maxy);
			child4=new Rectangle(compare[no_compare]->maxx,compare[no_compare]->miny,income->maxx,compare[no_compare]->maxy);
			area=non_overlap(child1,compare,no_compare-1)+non_overlap(child2,compare,no_compare-1)+non_overlap(child3,compare,no_compare-1)+non_overlap(child4,compare,no_compare-1);
			delete child1;
			delete child2;
			delete child3;
			delete child4;
			return (area);
		} else {
			//printf("none\n");
			return (income->area());
		}
	}
}

int main (int argc, char** argv) {
	int no_points,i,set=1;
	Rectangle** original;
	float x,y,r,area;
	
	FILE* fin=fopen("mobile.txt","r");
	
	do {
		fscanf(fin,"%d",&no_points);
		//printf("%d\n",no_points);
		if (no_points!=0) {
			original=new Rectangle*[no_points];
			// read input
			for (i=0;i<no_points;i++) {
				fscanf(fin,"%f %f %f",&x,&y,&r);
				original[i]=new Rectangle(x,y,r);
			}
			area=0;
			//printf("%d set\n",set);
			for (i=0;i<no_points;i++)
				area+=non_overlap(original[i],original,i-1);
			printf("%d %.2f\n",set,area);
			set++;						
		}
	} while (no_points!=0);
	fclose(fin);
}

