#include <iostream>
using namespace std;

class Interval
{
      double begin, end;
      bool left, right;
      bool empty;
public:
       Interval(int b = 0, int e = 0, bool l = false, bool r = false): begin(b), end(e), left(l), right(r), empty(false)
			{
           if ((b == e) && (l == r) && l )  empty = true; 
           }
};

class IntervalSet 
{
private:
		Interval *mass;
		int length;
		bool empty;
public:
		Intervalset () : mass(NULL), length(0), empty(true)
		Intervalset (const Interval &a) 
			{
			
			if (a.empty)
				{
				mass = new Interval[1];
				mass[0] = a;
				length = 1;
				empty = false;
				}
			else
				{
				mass = NULL;
				empty = true;
				length = 0;
				}
			Intervalset (const Intervalset &a) 
			{
			int i;
			
			if (a.empty)
				{
				length = a.length;
				mass = new Interval[length];
				for(i = 0; i < length; i++) mass[i] = a.mass[i];
				empty = a.empty
				}
			else Intervalset (*this)
				
			}
		Intervalset operator+=(const Interval &a);
		Intervalset operator+=(double a);
       
};

Interval:: Interval operator=(const Interval &a)
public:
		{
		begin = a.begin;
		end = a.end;
		left = a.left;
		right = a.right;
		empty = a.empty;
		}
	   
Interval:: Intervalset operator+(const Interval &a)
	{
	Intervalset temp;
	
	if ((begin > a.end) || (end < a.begin)) 
		{
		temp.mass = new Interval[2];
		if (begin > a.end) {temp.mass[0] = a ; temp.mass[1] = (*this);}
			else {temp.mass[0] = (*this) ; temp.mass[1] = a;}
		}
	else 
		{
		temp.mass = new Interval[1];
		if (begin > a.begin) temp.mass[0].begin = a.begin;
			else if (begin < a.begin) temp.mass[0].begin = begin;
				else temp.mass[0].left = left || a.left;
		if (end > a.end) temp.mass[0].end = a.end;
			else if (end < a.end) temp.mass[0].end = end;
				else temp.mass[0].right = right || a.right;
		}
	return temp;
	}

Interval:: Intervalset operator-(const Interval &a)
	{
	Intervalset temp;
	
	if (((begin > a.begin) && (end < a.end)) || ((begin = a.begin) && (end = a.end) && (left <= a.left) && (right <= a.right))) return temp;
	if (((begin < a.begin) && (end > a.end)) || ((begin = a.begin) && (end = a.end) && (left > a.left) && (right > a.right)))
		{
		temp.mass = new Interval[2];
		temp.mass[0].begin = begin;
		temp.mass[0].end = a.begin;
		temp.mass[0].left = left;
		temp.mass[0].right =  a.left;
		temp.mass[1].begin = a.end;
		temp.mass[1].end = end;
		temp.mass[1].left = a.right;
		temp.mass[1].right = right;
		
		return temp;
		}
	else 
		{
		temp.mass = new Interval[1];
		if ((begin > a.begin) && (end > a.end))
			{
			temp.mass[0].left = a.left
			temp.mass[0].begin = a.begin;
			temp.mass[0].end = end;
			temp.mass[0].right = right;
			}
		else 
			{
			temp.mass[0].left = left
			temp.mass[0].begin = begin;
			temp.mass[0].end = a.end;
			temp.mass[0].right = a.right;
			if (begin == a.begin) temp.mass[0].left = true;
			if (end == a.end) temp.mass[0].right = true;
			}
		return temp;
		}
	}	

Intervalset:: Intervalset operator+(const Interval &a)
	{
	int bb, be, eb, ee, i, lentmp;
	Intervalset temp;
       
	if (a.empty)
		{
		if ((a.begin < mass[length - 1].end) || (a.end > mass[0].begin))
			{
			for(i = 0; (a.begin >= mass[i].begin); i++);
			bb = --i;// последний эл-т меньший begin
			for(i = 0; (a.begin >= mass[i].end); i++);
			be = i;// последний эл-т меньший end
			for(i = 0; (a.end >= mass[i].begin); i++);
			eb = --i;// последний эл-т меньший begin
			for(i = 0; (a.end >= mass[i].end); i++);
			ee = i;// последний эл-т меньший end
			if (bb == be == eb == be)
			else
				{
				lentmp = eb - be;
				temp.length = length - lentmp + ((eb - bb + ee - be) div 2);
				if (!lentmp)
					{
					temp.mass = new Interval[temp.length];
					for(i = 0; i < bb; i++) temp.mass[i] = mass[i];
					for(i = bb; i < temp.length; i++) temp.mass[i] = mass[i + lentmp];
					if (bb != be)
						{
						if (temp.mass[bb].begin != a.begin)
							{
							temp.mass[bb].begin = a.begin;
							temp.mass[bb].left = a.left;
							}
						else if (temp.mass[bb].left < a.left) temp.mass[bb].left = a.left;
						}
					if (eb != ee) 
						{
						if (temp.mass[bb].end != a.end)
							temp.mass[bb].end = a.end;
							temp.mass[bb].right = a.right;
						else if (temp.mass[bb].right < a.right) temp.mass[bb].right = a.right;
						}
					if ((bb == be) && (eb == ee))
						{
						temp.mass[bb].end = mass[ee].end;
						temp.mass[bb].right = mass[ee].right;
						}
					delete [] mass;
					}
				}
			}
		}
       else
           {
		   temp.length = length + 1;
           temp.mass = new Interval[temp.length];
           if (a.begin > mass[temp.length - 1].end) 
              {
              temp.mass[temp.length - 1]= a;
              for(i = 0; i < temp.length - 1; i++) temp.mass[i]=mass[i];
              }
           else
               {
               temp.mass[0]= a;
               for(i = 1; i < length; i++) temp.mass[i]=mass[i - 1];
               }
           delete [] mass;
           }
		return temp;
    }

Intervalset operator-(const Intervalset &b, const Interval &a)
	{
	int bb, be, eb, ee, i, lentmp, t = 0;
	Intervalset temp;
       
	if (!a.empty)
		{
		if ((a.begin > b.mass[length - 1].end) && (a.end < b.mass[0].begin))
			{
			for(i = 0; ((a.begin < b.mass[i].begin) || ((a.begin == b.mass[i].begin) && (a.left < b.mass[i].left))); i++);
			bb = --i;// последний эл-т меньший begin
			for(i = 0; ((a.begin < b.mass[i].end) || ((a.begin == mass[i].end) && ((a.left < b.mass[i].right) && (a.left == false)))); i++);
			be = i;// последний эл-т меньший end
			for(i = 0; ((a.end < b.mass[i].begin) || ((a.end == b.mass[i].begin) && ((a.right < b.mass[i].left) && (a.left == false))); i++);
			eb = --i;// последний эл-т меньший begin
			for(i = 0; ((a.end < b.mass[i].end) || ((a.end == b.mass[i].end) && (a.right < b.mass[i].right))); i++);
			ee = i;// последний эл-т меньший end
			if ((ee == eb) && (be == bb) t = 1;
			temp.length = length + t - (ee - be + eb - bb) div 2 ;
			lentmp = (ee - eb + be - bb) div 2 - t;
			
				temp.mass = new Interval[temp.length];
				for(i = 0; i < bb; i++) temp.mass[i] = mass[i];
				for(i = bb; i < temp.length; i++) temp.mass[i] = mass[i + lentmp];
				if (bb == be)
					{
					if (temp.mass[bb].begin != a.begin)
						{
						temp.mass[bb].end = a.begin;
						temp.mass[bb].right = true - a.left;
						}
					else if (temp.mass[bb].left < a.left) temp.mass[bb].right = true - a.left;
					}
				if (eb == ee) 
					{
					if (temp.mass[eb].end != a.end)
						{
						temp.mass[eb].begin = a.end;
						temp.mass[eb].left = true - a.right;
						}
					else if (temp.mass[eb].right > a.right) temp.mass[eb].left = true - a.right;
					}
				delete [] mass;
				}
			}
	return temp;
    }

Intervalset operator+(const Intervalset &b, const Interval &a)
	{
	int bb, be, eb, ee, i, lentmp, t = 1;
	Intervalset temp;
       
	if (a.empty)
		{
		if ((a.begin < mass[length - 1].end) || (a.end > mass[0].begin))
			{
			for(i = 0; ((a.begin > mass[i].begin) || ((a.begin == mass[i].begin) && (a.left < mass[i].left))); i++);
			bb = --i;// последний эл-т меньший begin
			for(i = 0; ((a.begin >= mass[i].end) || ((a.begin == mass[i].end) && ((a.left >= mass[i].right) && (a.left == false)))); i++);
			be = i;// последний эл-т меньший end
			for(i = 0; ((a.end >= mass[i].begin) || ((a.end == mass[i].begin) && ((a.right <= mass[i].left) && (a.left == false))); i++);
			eb = --i;// последний эл-т меньший begin
			for(i = 0; ((a.end >= mass[i].end) || ((a.end == mass[i].end) && (a.right >= mass[i].right))); i++);
			ee = i;// последний эл-т меньший end
			if ((ee == eb) && (eb != be) && (be == bb) t = 0;
			temp.length = length - t + (ee - be + eb - bb) div 2 ;
			lentmp = (ee - eb + be - bb) div 2 - t;
				if (!lentmp)
					{
					temp.mass = new Interval[temp.length];
					for(i = 0; i < bb; i++) temp.mass[i] = mass[i];
					for(i = bb; i < temp.length; i++) temp.mass[i] = mass[i + lentmp];
					if (bb != be)
						{
						if (temp.mass[bb].begin != a.begin)
							{
							temp.mass[bb].begin = a.begin;
							temp.mass[bb].left = a.left;
							}
						else if (temp.mass[bb].left < a.left) temp.mass[bb].left = a.left;
						}
					if (eb != ee) 
						{
						if (temp.mass[bb].end != a.end)
							{
							temp.mass[bb].end = a.end;
							temp.mass[bb].right = a.right;
							}
						else if (temp.mass[bb].right < a.right) temp.mass[bb].right = a.right;
						}
					if ((bb == be) && (eb == ee))
						{
						temp.mass[bb].end = mass[ee].end;
						temp.mass[bb].right = mass[ee].right;
						}
					delete [] mass;
					}
				}
			}
       else
           {
		   temp.length = length + 1;
           temp.mass = new Interval[temp.length];
           if (a.begin > mass[temp.length - 1].end) 
              {
              temp.mass[temp.length - 1]= a;
              for(i = 0; i < temp.length - 1; i++) temp.mass[i]=mass[i];
              }
           else
               {
               temp.mass[0]= a;
               for(i = 1; i < length; i++) temp.mass[i]=mass[i - 1];
               }
           delete [] mass;
           }
		return temp;
    }

Intervalset:: Intervalset& operator+=(const Interval &a)
		{
		(*this) = (*this) + a;
		
		return (*this);
		}