#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <map>
using namespace std;
#define MAXN 300008

const int offset = 1 << 19;

int n, c, m;
int niz[ MAXN ];

struct node{
  int cnt[ 10 ];
} T[ offset << 1 ];

void build( int x, int lo, int hi ){
  if( lo+1 == hi ){
    memset( T[x].cnt, 0, sizeof T[x].cnt );
    ++T[x].cnt[ niz[lo] ];
    return; 
  }
  int mid = ( lo+hi+1 ) >> 1;
  build( 2*x, lo, mid );
  build( 2*x+1, mid, hi );
  for( int i = 0; i < 10; ++i )
    T[x].cnt[i] = T[2*x].cnt[i] + T[2*x+1].cnt[i];
}

int A, B;
node query( int x, int lo, int hi ){
  if( hi <= A || lo >= B ) return node( );
  if( hi <= B && lo >= A ) return T[x];
  int mid = ( lo+hi+1 ) >> 1;
  node ret;
  node lijevi = query( 2*x, lo, mid );
  node desni  = query( 2*x+1, mid, hi );
  for( int i = 0; i < 10; ++i )
    ret.cnt[i] = lijevi.cnt[i] + desni.cnt[i];
  return ret;
}

int main( ){
  scanf( "%d%d", &n, &c );
  for( int i = 0; i < n; ++i ){
    scanf( "%d", &niz[i] );
    --niz[i];
  }
  build( 1, 0, n );
  scanf( "%d", &m );
  
  while( m-- ){
    scanf( "%d%d", &A, &B );
    --A;
    node x = query( 1, 0, n );
    int need = (B-A) >> 1;
    int best = -1;
    for( int i = 0; i < 10; ++i )
      if( x.cnt[i] > need )
        best = i;
    if( best == -1 ) printf( "ne\n" );
    else printf( "da %d\n", best+1 ); 
  }
  //system( "pause" );
  return 0;    
}
