#include<bits/stdc++.h>
#define mid (a[p].l+a[p].r>>1)
using namespace std;
int zs[100001];
int tot,n,q;
int nex[1000001];
bool pd(int n){
for(int j=1;j<=tot&&zs[j]*zs[j]<=n;j++){
if(n%zs[j]==0){
return 0;
}
}
return 1;
}
set<int>s[100001];
struct Node{
int l,r,w;
bool bj=0;
}a[8000001];
void Push_up(int p){
a[p].w=min(a[p*2].w,a[p*2+1].w);
return;
}
void New_Tree(int p,int l,int r){
a[p].l=l;
a[p].r=r;
a[p].w=1e9;
if(l==r){
return;
}
New_Tree(p*2,l,mid);
New_Tree(p*2+1,mid+1,r);
}
void Find_nex(int p,int x){
if(a[p].l==a[p].r){
int mi=1e9;
for(int i=1;i<=tot&&zs[i]<=x;i++){
if(x%zs[i]!=0){
continue;
}
mi=min(mi,*s[i].upper_bound(x));
}
a[p].w=mi;
return;
}
if(mid>x){
Find_nex(p*2,x);
}
else{
Find_nex(p*2+1,x);
}
Push_up(p);
}
void Merge(int p,int x){
if(a[p].l==a[p].r){
if(a[p].bj){
nex[x]=1e9;
for(int i=1;i<=tot&&zs[i]<=x;i++){
if(x%zs[i]!=0){
continue;
}
s[i].erase(x);
auto xx=s[i].upper_bound(x);
if(s[i].size()<1){
continue;
}
--xx;
Find_nex(1,*xx);
}
a[p].w=1e9;
}
else{
int mi=1e9;
for(int i=1;i<=tot&&zs[i]<=x;i++){
if(x%zs[i]!=0){
continue;
}
s[i].insert(x);
auto xx=s[i].upper_bound(x);
mi=min(mi,*xx);
if(s[i].size()<3){
continue;
}
--xx;
--xx;
Find_nex(1,*xx);
}
a[p].w=mi;
}
a[p].bj=!a[p].bj;
return;
}
if(mid<x){
Merge(p*2+1,x);
}
else{
Merge(p*2,x);
}
Push_up(p);
}
int Find(int p,int l,int r){
if(a[p].l>=l&&a[p].r<=r){
return a[p].w;
}
if(l>mid){
Push_up(p);
return Find(p*2+1,l,r);
}
else if(r<=mid){
Push_up(p);
return Find(p*2,l,r);
}
else{
Push_up(p);
return min(Find(p*2+1,l,r),Find(p*2,l,r));
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=2;i<=n;i++){
if(pd(i)){
zs[++tot]=i;
s[tot].insert(1000001);
}
}
New_Tree(1,1,n);
for(int i=1;i<=q;i++){
char ch;
cin>>ch;
if(ch=='S'){
int x;
cin>>x;
Merge(1,x);
}
else{
int l,r;
cin>>l>>r;
if(Find(1,l,r)<=r){
cout<<"DA\n";
}
else{
cout<<"NE\n";
}
}
}
return 0;
}