#include<bits/stdc++.h>
using namespace std;
const double line=0.74751;
const int N=1e6+5;
struct Node {
int l,r,dat,size,same;
} tree[9*N];
int node[N];
int cnt,longth;
int n,q;
char opt;
int x,y;
int root[N];
void make(int &pos,int val) {
tree[++cnt].dat=val;
tree[cnt].size=1;
tree[cnt].same=1;
pos=cnt;
}
void up(int pos) {
tree[pos].size=tree[tree[pos].l].size+tree[tree[pos].r].size+tree[pos].same;
}
bool bug(int pos) {
return max(tree[tree[pos].l].size,tree[tree[pos].r].size)>tree[pos].size*line;
}
void under(int pos) {
if(pos==0)return;
under(tree[pos].l);
if(tree[pos].same!=0)node[++longth]=pos;
under(tree[pos].r);
}
int build(int l,int r) {
if(l>=r)return 0;
int mid=(l+r)/2;
tree[node[mid]].l=build(l,mid);
tree[node[mid]].r=build(mid+1,r);
up(node[mid]);
return node[mid];
}
void debug(int &pos) {
if(bug(pos)) {
longth=0;
under(pos);
pos=build(1,longth+1);
}
}
void take(int val,int &pos) {
if(pos==0)make(pos,val);
else if(val<tree[pos].dat)take(val,tree[pos].l);
else if(val>tree[pos].dat)take(val,tree[pos].r);
else tree[pos].size++,tree[pos].same++;
up(pos);
debug(pos);
}
void del(int val,int &pos) {
if(pos==0) {
return;
} else if(val<tree[pos].dat)del(val,tree[pos].l);
else if(val>tree[pos].dat)del(val,tree[pos].r);
else {
tree[pos].size--;
tree[pos].same--;
return;
}
up(pos);
debug(pos);
}
int wrank(int val,int loc) {
int pos=root[loc],rnk=1;
while(pos) {
if(tree[pos].dat==val) {
rnk+=tree[tree[pos].l].size;
break;
}
if(val<=tree[pos].dat)
pos=tree[pos].l;
else {
rnk+=tree[tree[pos].l].size+tree[pos].same;
pos=tree[pos].r;
}
}
return rnk;
}
int num(int val,int loc) {
int pos=root[loc];
while(pos) {
int l=tree[tree[pos].l].size;
if(l<val&&val<=l+tree[pos].same) {
break;
} else if(l>=val)pos=tree[pos].l;
else {
val-=l+tree[pos].same;
pos=tree[pos].r;
}
}
return tree[pos].dat;
}
int pre(int val,int loc) {
return num(wrank(val,loc)-1,loc);
}
int last(int val,int loc) {
return num(wrank(val+1,loc),loc);
}
int pr[N],tot;
bool vis[N],ope[N];
int ys[N][10];
void init() {
for(int i=2;i<=n;i++) {
if(!vis[i]) pr[++tot]=i,ys[i][1]=i,ys[i][0]=1;
for(int j=1;i*pr[j]<=n;j++) {
vis[i*pr[j]]=1;
if(i%pr[j]==0) {
for(int l=1;l<=ys[i][0];l++) ys[i*pr[j]][l]=ys[i][l];
ys[i*pr[j]][0]=ys[i][0];
break;
}
for(int l=1;l<=ys[i][0];l++) ys[i*pr[j]][l]=ys[i][l];
ys[i*pr[j]][ys[i][0]+1]=pr[j];
ys[i*pr[j]][0]=ys[i][0]+1;
}
}
}
struct node {
int l,r,dat;
} tr[N*4];
void tbd(int pos,int l,int r) {
tr[pos].l=l,tr[pos].r=r;
if(l==r) return;
int mid=(l+r)/2;
tbd(pos*2,l,mid);tbd(pos*2+1,mid+1,r);
}
void tcg(int pos,int gl,int val) {
if(tr[pos].l>gl||tr[pos].r<gl) return;
if(tr[pos].l==tr[pos].r) {
tr[pos].dat=val;
return;
}
tcg(pos*2,gl,val);tcg(pos*2+1,gl,val);
tr[pos].dat=max(tr[pos*2].dat,tr[pos*2+1].dat);
}
int tch(int pos,int l,int r) {
if(tr[pos].l>r||tr[pos].r<l) return -1;
if(tr[pos].l>=l&&tr[pos].r<=r) return tr[pos].dat;
return max(tch(pos*2,l,r),tch(pos*2+1,l,r));
}
int main() {
cin>>n>>q;
init();
tbd(1,1,n);
while(q--) {
cin>>opt;
if(opt=='S') {
cin>>x;
if(!ope[x]) {
for(int i=1;i<=ys[x][0];i++) {
take(x,root[ys[x][i]]);
int pp=pre(x,ys[x][i]),ll=last(x,ys[x][i]);
if(tch(1,x,x)<pp) tcg(1,x,pp);
if(tch(1,ll,ll)<x) tcg(1,ll,x);
}
ope[x]=1;
} else {
for(int i=1;i<=ys[x][0];i++) {
int ll=last(x,ys[x][i]);
del(x,root[ys[x][i]]);
if(tch(1,ll,ll)==x){
tcg(1,ll,0);
for(int j=1;j<=ys[ll][0];j++) {
int pp=pre(ll,ys[ll][j]);
if(tch(1,ll,ll)<j) tcg(1,ll,j);
}
}
}
tcg(1,x,0);
ope[x]=0;
}
} else {
cin>>x>>y;
if(tch(1,1,y)>=x) cout<<"DA"<<endl;
else cout<<"NE"<<endl;
}
}
}