Go: package main

import (
	"bufio"
	"os"
	"strings"
	"strconv"
	"fmt"
)

var scanner= bufio.NewScanner(os.Stdin)

func main() {
	result := make([][]int, 4)
	for i :=range result {
		result[i] = make([]int, 2)
	}
	for scanner.Scan() {
		buf := strings.Split(scanner.Text(), " ")
		l, _ := strconv.ParseFloat(buf[0], 64)
		r, _ := strconv.ParseFloat(buf[1], 64)
		if 1.1 <= l {
			result[0][0]++
		} else if 0.6 <= l && l < 1.1 {
			result[1][0]++
		} else if 0.2 <= l && l < 0.6 {
			result[2][0]++
		} else {
			result[3][0]++
		}
		if 1.1 <= r {
			result[0][1]++
		} else if 0.6 <= r && r < 1.1 {
			result[1][1]++
		} else if 0.2 <= r && r < 0.6 {
			result[2][1]++
		} else {
			result[3][1]++
		}
	}
	ans := make([][]string, 4)
	for i :=range ans {
		ans[i] = make([]string, 2)
	}
	for i := range result {
		for j := range result[i] {
			ans[i][j] = strconv.Itoa(result[i][j])
		}
	}
	for i := 0; i < 4; i++ {
		fmt.Println(strings.Join(ans[i], " "))
	}
}

C++: #include<bits/c++.h>

using namespace std;

int main(){

  double l;
  double r;

  int l_a=0;
  int l_b=0;
  int l_c=0;
  int l_d=0;
  int r_a=0;
  int r_b=0;
  int r_c=0;
  int r_d=0;
  
  while(cin>>l>>r){

	if(l>=1.1)
	  l_a++;
	else if(l>=0.6 && l<1.1)
	  l_b++;
	else if(l>=0.2 && l<0.6)
	  l_c++;
	else if(l<0.2)
	  l_d++;

	if(r>=1.1)
	  r_a++;
	else if(r>=0.6 && r<1.1)
	  r_b++;
	else if(r>=0.2 && r<0.6)
	  r_c++;
	else if(r<0.2)
	  r_d++;
	
  }

  cout<<l_a<<" "<<r_a<<endl;
  cout<<l_b<<" "<<r_b<<endl;
  cout<<l_c<<" "<<r_c<<endl;
  cout<<l_d<<" "<<r_d<<endl;
  
}

C++: #include <iostream>
using namespace std;
int main(){
	const double REF[]={0.0,0.2,0.6,1.1};
	double l,r;
	int a[4]={0},b[4]={0};
	while(cin>>l>>r){
		for(int i=3;i>=0;--i){
			if(REF[i]<=l){
				a[i]++;
				break;
			}
		}
		for(int i=3;i>=0;--i){
			if(REF[i]<=r){
				b[i]++;
				break;
			}
		}
	}
	for(int i=3;i>=0;--i){
	cout<<a[i]<<" "<<b[i]<<"\n";
	}
	return 0;
}

C++: #include <stdio.h>
#include <cmath>
#include <algorithm>

using namespace std;

int main(){

	int left[4] = {0,0,0,0},right[4] = {0,0,0,0};
	double l_e,r_e;

	while(scanf("%lf %lf",&l_e,&r_e)!=EOF){
		if(l_e >= 1.1){
			left[0]++;
		}else if(l_e >= 0.6){
			left[1]++;
		}else if(l_e >= 0.2){
			left[2]++;
		}else{
			left[3]++;
		}

		if(r_e >= 1.1){
			right[0]++;
		}else if(r_e >= 0.6){
			right[1]++;
		}else if(r_e >= 0.2){
			right[2]++;
		}else{
			right[3]++;
		}
	}

	printf("%d %d\n%d %d\n%d %d\n%d %d\n",left[0],right[0],left[1],right[1],left[2],right[2],left[3],right[3]);

    return 0;
}

C++: #include<stdio.h>
int main(void)
{
	double h,m;
	int cMA,cHA;
	int cMB,cHB;
	int cMC,cHC;
	int cMD,cHD;
	cMA=0;
	cHA=0;
	cMB=0;
	cHB=0;
	cMC=0;
	cHC=0;
	cMD=0;
	cHD=0;
		while(scanf("%f %f",&h,&m)!=EOF){
			if(h>=1.1){
				cMA++;
			}
			else if(0.6<=h || h<1.1){
				cMB++;
			}
			else if(0.2<=m || m<0.6){
				cMC++;
			}
			else if(0.2<h){
				cMD++;
			}
			if(m>=1.1){
				cHA++;
			}
			else if(0.6<=m || m<1.1){
				cHB++;
			}
			else if(0.2<=m || m<0.6){
				cHC++;
			}
			else if(0.2<m){
				cHD++;
			}
	}
	printf("%d %d\n %d %d\n %d %d\n %d %d\n",cHA,cMA,cHB,cMB,cHC,cMC,cHD,cMD);
	return 0;
}

C++: #include<iostream>
using namespace std;

int main()
{
	int LA, LB, LC, LD, RA, RB, RC, RD;
	LA = LB = LC = LD = RA = RB = RC = RD = 0;
	while (1) 
	{
		double a, b;
		cin >> a >> b;
		if (cin.fail());
		if (a <0.2)LD++;
		else if (a < 0.6)LC++;
		else if (a < 1.1)LB++;
		else LA++;
		if (b <0.2)RD++;
		else if (b < 0.6)RC++;
		else if (b < 1.1)RB++;
		else RA++;
	}
	cout << LA << " " << RA << endl << LB << " " << RB << endl << LC << " " << RC << endl << LD << " " << RD << endl;
}

C++: #include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<cstring>
using namespace std;

#define rep(i,n) for(int i=0;i<n;i++)
#define REP(n) rep(i,n)
#define all(n) n.begin(),n.end()

const int L = 0, R = 1, A = 0, B = 1, C = 2, D = 3;

int e[2][4];

int main()
{
    double r,l;
    while(cin >> l >> r)
    {
        if(l < 0.2) e[L][D]++;
        else if(l < 0.6) e[L][C]++;
        else if(l < 1.1) e[L][B]++;
        else e[L][A]++;

        if(r < 0.2) e[R][D]++;
        else if(r < 0.6) e[R][C]++;
        else if(r < 1.1) e[R][B]++;
        else e[R][A]++;

    }
    REP(4)cout << e[L][i] << " " << e[R][i] << endl;

    return 0;
}

C++: #include<stdio.h>
int main(void)
{
	float a,s;
	int d[4],f[4],g;
	for(g=1;g<=4;g++){
		d[g]=0;
		f[g]=0;
	}
	while(scanf("%f %f",&a,&s)!=EOF){
		if(a>=1.1){
			d[1]++;
		}
		else if(a<1.1&&a>=0.6){
			d[2]++;
		}
		else if(a<0.6&&a>=0.2){
			d[3]++;
		}
		else if(a>0.2){
			d[4]++;
		}
		if(s>=1.1){
			f[1]++;
		}
		else if(s<1.1&&s>=0.6){
			f[2]++;
		}
		else if(s<0.6&&s>=0.2){
			f[3]++;
		}
		else if(s>0.2){
			f[4]++;
		}
	}
	for(g=1;g<=4;g++){
		printf("%d %d\n",d[g],f[g]);
	}
	return 0;
}

C++: #include<iostream>
#include<vector>
using namespace std;

int main(){
  double l, r;
  string s;
  vector<int> L(4, 0), R(4, 0);
  while (std::getline(std::cin, s)) {
    sscanf(s.data(), "%lf %lf", &l, &r);
    if(l >= 1.1){
      L[0]++;
    }else if(l >= 0.6){
      L[1]++;
    }else if(l >= 0.2){
      L[2]++;
    }else{
      L[3]++;
    }
    if(r >= 1.1){
      R[0]++;
    }else if(r >= 0.6){
      R[1]++;
    }else if(r >= 0.2){
      R[2]++;
    }else{
      R[3]++;
    }
  }
  for (int i = 0; i < 4; i++) {
    std::cout << L[i] << " " << R[i] << std::endl;
  }
  return 0;
}

C++: //include
//------------------------------------------
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <fstream>
#include <complex>
#include <math.h>

using namespace std;

//conversion
//------------------------------------------
inline long toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
inline long toLong(string s) {long v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}

//math
//-------------------------------------------
template<class T> inline T sqr(T x) {return x*x;}

//typedef
//------------------------------------------
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef pair<long, long> PLL;
typedef long long LL;
//container util
//------------------------------------------
#define ALL(a)  (a).begin(),(a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define MP make_pair
#define SZ(a) int((a).size())
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())

//repetition
//------------------------------------------
#define FOR(i,a,b) for(long i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

//constant
//--------------------------------------------

//clear memory
#define CLR(a) memset((a), 0 ,sizeof(a))

const long double EPS = 1e-12;
const double INF = 1e9;

struct edge{int to,cost;};
typedef pair<int,int> P;//firstは最短距離,secondは頂点番号


int main(){
	double x[2];
	int ans[4][2];
	CLR(ans);
	while(cin>>x[0]>>x[1]){
		REP(i,2){
			if(x[i]>=1.1)ans[0][i]++;
			else if(x[i]>=0.6)ans[1][i]++;
			else if(x[i]>=0.2)ans[2][i]++;
			else ans[3][i]++;
		}
	}
	
	
	REP(i,4)cout<<ans[i][0]<<" "<<ans[i][1]<<endl;
	return 0;
}