bit 套 sgt
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;i++)
#define R(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=2e7+7;
int n,m,k,cnt,rt[N],idx,las[N],ans[N],tot;
struct edge{
int r,c,b,id;
edge(int _r=0,int _c=0,int _b=0){
r=_r,c=_c,b=_b;
}
bool operator<(const edge& x)const{
if(r==x.r){
if(c==x.c){
return b<x.b;
}
return c<x.c;
}
return r<x.r;
}
}s[N];
struct SGT{
int l,r,val,id;
}t[N];
inline int lowbit(int x){
return x&(-x);
}
inline void pushup(int now){
(t[t[now].l].val>t[t[now].r].val)?t[now].val=t[t[now].l].val:t[now].val=t[t[now].r].val;
(t[t[now].l].val>t[t[now].r].val)?t[now].id=t[t[now].l].id:t[now].id=t[t[now].r].id;
}
inline void update(int &now,int now_l,int now_r,int l,int r,int val,int id){
if(!now) now=++idx;
if(now_l==now_r){
t[now].val=val;
t[now].id=id;
return ;
}
int mid=(now_l+now_r)>>1;
if(l<=mid) update(t[now].l,now_l,mid,l,r,val,id);
if(r>mid) update(t[now].r,mid+1,now_r,l,r,val,id);
pushup(now);
}
inline void add(int x,int y,int c,int id){
while(x<=n){
update(rt[x],0,m,y,y,c,id);
x+=lowbit(x);
}
}
inline pair<int,int> query_mx(int &now,int now_l,int now_r,int l,int r){
if(!now) now=++idx;
if(l<=now_l&&r>=now_r){
return make_pair(t[now].val,t[now].id);
}
int mid=(now_l+now_r)>>1;
pair<int,int> ans,k;
ans=make_pair(0,0);
k=make_pair(0,0);
if(l<=mid){
k=query_mx(t[now].l,now_l,mid,l,r);
if(k.first>ans.first){
ans=k;
}
}
if(r>mid){
k=query_mx(t[now].r,mid+1,now_r,l,r);
if(k.first>ans.first){
ans=k;
}
}
pushup(now);
return ans;
}
inline pair<int,int> query(int x,int y){
pair<int,int> sum=make_pair(0,0);
while(x){
pair<int,int> k=query_mx(rt[x],0,m,0,y);
if(sum.first<k.first){
sum=k;
}
x-=lowbit(x);
}
return sum;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>k;
F(i,1,k){
cin>>s[i].r>>s[i].c;
s[i].b=1;
}
cnt=k;
s[++cnt]=edge(1,1,0);
s[++cnt]=edge(n,m,0);
sort(s+1,s+cnt+1);
F(i,1,cnt){
pair<int,int> pk,pk2;
pk=query(s[i].r-1,s[i].c);
pk2=query(s[i].r,s[i].c-1);
if(pk.first<pk2.first){
pk=pk2;
}
las[i]=pk.second;
add(s[i].r,s[i].c,pk.first+s[i].b,i);
}
cout<<query(n,m).first<<"\n";
int now=cnt;
ans[++tot]=now;
while(now!=0){
now=las[now];
if(!now) break;
ans[++tot]=now;
}
reverse(ans+1,ans+tot+1);
s[0].r=s[0].c=1;
F(i,1,tot){
for(int j=1;j<=s[ans[i]].r-s[ans[i-1]].r;j++){
cout<<"D";
}
for(int j=1;j<=s[ans[i]].c-s[ans[i-1]].c;j++){
cout<<"R";
}
}
return 0;
}