1 /*
2 zoj1610
3 这题是离散化,区间特殊查询的,和之前的第4 题是异曲同工的
4 */
5 #include<iostream>
6 #include<cstdio>
7 #include<cstring>
8 #include<algorithm>
9 using namespace std;
10 struct Node
11 {
12 int l,r,value;
13 }tr[40005]={0};
14 int col[8005]={0};
15 int c[8005]={0};
16 int discrete[40005]={0};
17 void build(int rt,int l,int r)
18 {
19 tr[rt].l=l;
20 tr[rt].r=r;
21 tr[rt].value=-1;
22 if(l==r)
23 return ;
24 int mid=(l+r)/2;
25 build(rt<<1,l,mid);
26 build(rt<<1|1,mid+1,r);
27 }
28 void Pushdown(int rt)
29 {
30 tr[rt<<1].value=tr[rt<<1|1].value=tr[rt].value;
31 tr[rt].value=-1;
32 }
33 void Update(int rt,int l,int r,int x)
34 {
35 if(tr[rt].value==x)
36 return ;
37 if(tr[rt].l>=l&&tr[rt].r<=r)
38 {
39 tr[rt].value=x;
40 return ;
41 }
42 if(tr[rt].value!=-1)
43 Pushdown(rt);
44 if(l<=tr[rt<<1].r)
45 {
46 if(r<=tr[rt<<1].r)
47 Update(rt<<1,l,r,x);
48 else
49 Update(rt<<1,l,tr[rt<<1].r,x);
50 }
51 if(r>=tr[rt<<1|1].l)
52 {
53 if(l>=tr[rt<<1|1].l)
54 Update(rt<<1|1,l,r,x);
55 else
56 Update(rt<<1|1,tr[rt<<1|1].l,r,x);
57 }
58 if(tr[rt<<1].value==tr[rt<<1|1].value&&tr[rt<<1].value!=-1)
59 tr[rt].value=tr[rt<<1].value;
60 }
61 int erfen(int l,int r,int x)
62 {
63 while(l<=r)
64 {
65 int mid=(l+r)/2;
66 if(x<discrete[mid])
67 r=mid-1;
68 else
69 l=mid+1;
70 }
71 return r;
72 }
73 void Query(int rt)
74 {
75 if(tr[rt].value!=-1)
76 {
77 for(int i=tr[rt].l;i<=tr[rt].r;i++)
78 col[i]=tr[rt].value;
79 return ;
80 }
81 if(tr[rt].l==tr[rt].r)
82 return ;
83 Query(rt<<1);
84 Query(rt<<1|1);
85 }
86 int main()
87 {
88 int n;
89 while(scanf("%d",&n)!=EOF&&n)
90 {
91 int a[8005][3]={0};
92 int t=0;
93 memset(col,-1,sizeof(col));
94 memset(c,0,sizeof(c));
95 memset(tr,0,sizeof(tr));
96 memset(discrete,0,sizeof(discrete));
97 for(int i=0;i<n;i++)
98 {
99 scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
100 discrete[t++]=a[i][0];
101 discrete[t++]=a[i][1];
102 }
103 sort(discrete,discrete+t);
104 int z=1;
105 for(int i=1;i<t;i++)
106 {
107 if(discrete[i]!=discrete[i-1])
108 discrete[z++]=discrete[i];
109 }
110 for(int i=z-1;i>0;i--)
111 {
112 if(discrete[i]-discrete[i-1]>1)
113 discrete[z++]=discrete[i-1]+1;
114 }
115 sort(discrete,discrete+z);
116 for(int i=z;i>0;i--)
117 {
118 discrete[i]=discrete[i-1];
119 }
120 build(1,1,z+5);
121 for(int i=0;i<n;i++)
122 {
123 int ll=erfen(1,z,a[i][0]);
124 int rr=erfen(1,z,a[i][1]);
125 Update(1,ll,rr-1,a[i][2]);
126 }
127 Query(1);
128 int temp=-1;
129 for(int i=1;i<=z;i++)
130 {
131 if(temp!=col[i])
132 {
133 c[col[i]]++;
134 temp=col[i];
135 }
136 }
137 for(int i=0;i<=8000;i++)
138 {
139 if(c[i]>0)
140 {
141 printf("%d %d\n",i,c[i]);
142 }
143 }
144 printf("\n");
145 }
146 return 0;
147 }