class
SegmentTreeInjectable:
def
__init__(
self
, n, identity_factory, func):
n2
=
1
<< (n
-
1
).bit_length()
self
.offset
=
n2
self
.tree
=
[identity_factory()
for
_
in
range
(n2 <<
1
)]
self
.func
=
func
self
.idf
=
identity_factory
@classmethod
def
from_array(
cls
, arr, identity_factory, func):
ins
=
cls
(
len
(arr), identity_factory, func)
ins.tree[ins.offset:ins.offset
+
len
(arr)]
=
arr
for
i
in
range
(ins.offset
-
1
,
0
,
-
1
):
l
=
i <<
1
r
=
l
+
1
ins.tree[i]
=
func(ins.tree[l], ins.tree[r])
return
ins
def
add(
self
, i, x):
i
+
=
self
.offset
self
.tree[i]
=
self
.func(
self
.tree[i], x)
self
.__upstream(i)
def
update(
self
, i, x):
i
+
=
self
.offset
self
.tree[i]
=
x
self
.__upstream(i)
def
__upstream(
self
, i):
tree
=
self
.tree
func
=
self
.func
while
i >
1
:
i >>
=
1
lch
=
i <<
1
rch
=
lch |
1
tree[i]
=
func(tree[lch], tree[rch])
def
get_range(
self
, a, b):
tree
=
self
.tree
func
=
self
.func
result_l
=
self
.idf()
result_r
=
self
.idf()
l
=
a
+
self
.offset
r
=
b
+
self
.offset
while
l < r:
if
r &
1
:
result_r
=
func(tree[r
-
1
], result_r)
if
l &
1
:
result_l
=
func(result_l, tree[l])
l
+
=
1
l >>
=
1
r >>
=
1
return
func(result_l, result_r)
def
get_all(
self
):
return
self
.tree[
1
]
def
get_point(
self
, i):
return
self
.tree[i
+
self
.offset]
def
leftmost(
self
, a, b, x, ev):
tree
=
self
.tree
l
=
a
+
self
.offset
r
=
b
+
self
.offset
r_found
=
-
1
while
l < r:
if
l &
1
:
if
ev(x, tree[l]):
return
self
._leftmost_sub(l, x, ev)
l
+
=
1
if
r &
1
:
if
ev(x, tree[r
-
1
]):
r_found
=
r
-
1
l >>
=
1
r >>
=
1
if
r_found
=
=
-
1
:
return
-
1
return
self
._leftmost_sub(r_found, x, ev)
def
_leftmost_sub(
self
, i, x, ev):
tree
=
self
.tree
while
i <
self
.offset:
l
=
i <<
1
if
ev(x, tree[l]):
i
=
l
else
:
i
=
l
+
1
return
i
-
self
.offset
def
rightmost(
self
, a, b, x, ev):
tree
=
self
.tree
l
=
a
+
self
.offset
r
=
b
+
self
.offset
l_found
=
-
1
while
l < r:
if
r &
1
:
if
ev(x, tree[r
-
1
]):
return
self
._rightmost_sub(r
-
1
, x, ev)
if
l &
1
:
if
ev(x, tree[l]):
l_found
=
l
l
+
=
1
l >>
=
1
r >>
=
1
if
l_found
=
=
-
1
:
return
-
1
return
self
._rightmost_sub(l_found, x, ev)
def
_rightmost_sub(
self
, i, x, ev):
tree
=
self
.tree
while
i <
self
.offset:
l
=
i <<
1
if
ev(x, tree[l
+
1
]):
i
=
l
+
1
else
:
i
=
l
return
i
-
self
.offset
def
debug_print(
self
):
i
=
1
while
i <
=
self
.offset:
print
(
self
.tree[i:i
*
2
])
i <<
=
1
def
encode(cnt, idx):
return
cnt <<
20
| idx
def
decode(key):
idx
=
key &
0b11111_11111_11111_11111
cnt
=
key >>
20
return
cnt, idx
h, w, n
=
map
(
int
,
input
().split())
coins
=
[]
for
_
in
range
(n):
r, c
=
map
(
int
,
input
().split())
coins.append((r
-
1
, c
-
1
))
NINF
=
-
1
<<
60
sgt
=
SegmentTreeInjectable(w,
lambda
: NINF,
max
)
sgt.update(
0
,
0
)
predecessor
=
[
-
1
]
*
(n
+
1
)
coins.sort()
for
i, (r, c)
in
enumerate
(coins, start
=
1
):
key
=
sgt.get_range(
0
, c
+
1
)
cnt, idx
=
decode(key)
predecessor[i]
=
idx
new_key
=
encode(cnt
+
1
, i)
sgt.update(c, new_key)
best
=
sgt.get_all()
cnt, idx
=
decode(best)
i
=
h
-
1
j
=
w
-
1
ans
=
[]
while
idx >
0
:
r, c
=
coins[idx
-
1
]
ans.extend([
'D'
]
*
(i
-
r))
ans.extend([
'R'
]
*
(j
-
c))
i
=
r
j
=
c
idx
=
predecessor[idx]
ans.extend([
'D'
]
*
i)
ans.extend([
'R'
]
*
j)
ans.reverse()
ans
=
''.join(ans)
print
(cnt)
print
(ans)