typedef long long ll;
const int N = 1e5 + 100 ;
const int mod = 1e9 + 7 ;
int f[ N] , r[ N] ;
bool vis[ N] ;
set< int > st;
vector< vector< int >> ans;
int find ( int k) {
if ( k == f[ k] ) return k;
return f[ k] = find ( f[ k] ) ;
}
class SummaryRanges {
public :
SummaryRanges ( ) {
st. clear ( ) ;
memset ( vis, 0 , sizeof vis) ;
for ( int i = 0 ; i <= 10009 ; ++ i) f[ i] = i, r[ i] = i;
}
void addNum ( int val) {
if ( vis[ val] ) return ;
vis[ val] = 1 ;
st. insert ( val) ;
if ( val - 1 >= 0 && vis[ val- 1 ] ) {
int x, y;
x = find ( val- 1 ) , y = find ( val) ;
f[ y] = x;
r[ x] = max ( r[ x] , r[ y] ) ;
st. insert ( x) ;
if ( st. find ( y) != st. end ( ) ) st. erase ( st. find ( y) ) ;
}
if ( vis[ val+ 1 ] ) {
int x, y;
x = find ( val) ; y = find ( val+ 1 ) ;
f[ y] = x;
r[ x] = max ( r[ x] , r[ y] ) ;
st. insert ( x) ;
if ( st. find ( y) != st. end ( ) ) st. erase ( st. find ( y) ) ;
}
}
vector< vector< int >> getIntervals ( ) {
ans. clear ( ) ;
vector< int > tmp;
tmp. clear ( ) ;
for ( auto it : st) {
tmp. push_back ( it) ;
tmp. push_back ( r[ it] ) ;
ans. push_back ( tmp) ;
tmp. clear ( ) ;
}
return ans;
}
} ;