#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; #define MAX 1000000 struct node { int left; int right; int value; }; node tree[4*MAX]; int a[20000],cnt,n; void Build_tree(int pos,int l,int r) { tree[pos].left=l; tree[pos].right=r; tree[pos].value=-1; int mid=(l+r)/2; if(l==r) { tree[pos].value=2; return ; } Build_tree(pos*2,l,mid); Build_tree(pos*2+1,mid+1,r); } void Update(int p,int v,int l,int r) { if(l<=tree[p].left&&tree[p].right<=r) { tree[p].value=v; return ; } if(tree[p].value!=-1) { tree[p*2+1].value=tree[p*2].value=tree[p].value; tree[p].value=-1; } int mid=(tree[p].left+tree[p].right)/2; if(l>mid) Update(p*2+1,v,l,r); else if(r<=mid) Update(p*2,v,l,r); else { Update(p*2,v,l,mid); Update(p*2+1,v,mid+1,r); } } void Query(int p,int l,int r) { if(l<=tree[p].left&&tree[p].right<=r) { if(tree[p].value!=-1) { a[cnt++]=tree[p].value; return ; } } if(tree[p].value!=-1) { tree[p*2].value=tree[p*2+1].value=tree[p].value; tree[p].value=-1; } int mid=(tree[p].left+tree[p].right)/2; if(l>mid) Query(p*2+1,l,r); else if(r<=mid) Query(p*2,l,r); else { Query(p*2,l,mid); Query(p*2+1,mid+1,r); } } int main() { char str[20]; int m,i,j,l,r,v; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; Build_tree(1,1,n); for(i=0;i<m;i++) { scanf("%s",&str); if(str[0]=='P') { scanf("%d%d%d",&l,&r,&v); Update(1,v,l,r); } else { cnt=0; memset(a,0,sizeof(a)); scanf("%d%d",&l,&r); Query(1,l,r); sort(a,a+cnt); printf("%d",a[0]); for(j=1;j<cnt;j++) if(a[j]!=a[j-1]) printf(" %d",a[j]); printf("\n"); } } } return 0; }