#include <cstdio>
#include <vector>
#include <utility>
#include <algorithm>

using namespace std;

typedef pair < int, int > pii;
typedef vector < pii > vpii;
typedef vpii::iterator vpiiit;


struct Node {
	int a, b;
	pii best;
	vpii v;
};

int niz[300100];
Node node[530000];
int n, c;

void spoji( vpii *vleft, vpii *vright, vpii *output ) {
	vpiiit left = vleft->begin();
	vpiiit right = vright->begin();
		
//	v.reserve( max( vleft->size(), vright->size() ) );
	while ( left != vleft->end() && right != vright->end() ) {
		if ( left->first == right->first ) {
			output->push_back( make_pair( left->first, left->second + right->second ) );
			++left;
			++right;
		} else if ( left->first < right->first ) {
			output->push_back( *left );
			++left;
		} else {
			output->push_back( *right );
			++right;
		}
	}
		
	while ( left != vleft->end() ) {
		output->push_back( *left );
		++left;
	}

	while ( right != vright->end() ) {
		output->push_back( *right );
		++right;
	}

}

void construct( int x, int a, int b ) {
	Node *p = node + x;
	p->a = a;
	p->b = b;
	if ( a == b ) {
		p->v.push_back( make_pair( niz[a], 1 ) );
	} else {
		construct( x * 2, a, (a + b) / 2 );
		construct( x * 2 + 1, (a + b) / 2 + 1, b );
		
		spoji( &node[x*2].v, &node[x*2+1].v, &p->v );
		
		p->best.second = -1;
		for ( vpiiit it = p->v.begin(); it != p->v.end(); ++it )
			if ( it->second > p->best.second ) p->best = *it;
	}
	
//	printf("x=%d [%d %d]   ", x, a, b);
//	for ( int i = 0; i < p->v.size(); ++i )
//		printf("[%d %d] ", p->v[i].first, p->v[i].second);
//	printf("\n");
}

inline int interval_intersection( int a, int b, int c, int d ) {
	return max( 0, min( b, d ) - max( a, c ) + 1 );
}

int qa, qb;

void _query( int x, int minimum, vpii *v ) {
	Node *p = node + x;
//	printf("x=%d [%d %d] minimum=%d\n", x, p->a, p->b, minimum);
	if ( p->a > qb || p->b < qa ) return;
	if ( p->best.second < minimum ) return;
	if ( p->a >= qa && p->b <= qb ) {
		for ( vpiiit it = p->v.begin(); it != p->v.end(); ++it )
			if ( it->second >= minimum )
				v->push_back( *it );
//		for ( int i = 0; i < v->size(); ++i )
//			printf("[%d %d] ", (*v)[i].first, (*v)[i].second);
//		printf("\n");
		return ;
	}
	
	vpii tmp1;
	vpii tmp2;
	int left = interval_intersection( qa, qb, node[x*2].a, node[x*2].b );
	int right = interval_intersection( qa, qb, node[x*2+1].a, node[x*2+1].b );
	_query( x*2, max( 0, minimum - right ), &tmp1 );
	_query( x*2+1, max( 0, minimum - left ), &tmp2 );
	
	spoji( &tmp1, &tmp2, v );
	
	int del = 0;
	for ( vpiiit it = v->begin(); it != v->end(); ++it ) {
		if ( it->second < minimum )
			++del;
		else
			*(it - del) = *it;
	}
	if ( del ) v->erase( v->end() - del, v->end() );


//		for ( int i = 0; i < v->size(); ++i )
//			printf("[%d %d] ", (*v)[i].first, (*v)[i].second);
//		printf("\n");
}

int query( int a, int b ) {
	int x = 1;
	for ( ;; ) {
		if ( node[x].a == node[x].b ) break;
		if ( node[x*2].a > b || node[x*2].b < a ) { x = x*2+1; continue; }
		if ( node[x*2+1].a > b || node[x*2+1].b < a ) { x = x*2; continue; }
		break;
	}
	
	qa = a;
	qb = b;
	vpii tmp;
	_query( x, (b - a + 1 + 2) / 2, &tmp );
	
	return tmp.size() == 0 ? -1 : tmp[0].first;
}


int main(void) {
	int i, m, a, b, result;
	
	scanf("%d%d", &n, &c);
	for ( i = 1; i <= n; ++i )
		scanf("%d", niz + i);
		
	construct( 1, 1, n );
		
	scanf("%d", &m);
	for ( i = 0; i < m; ++i ) {
		scanf("%d%d", &a, &b);
		result = query( a, b );
		if ( result == -1 )
			puts( "ne" );
		else
			printf("da %d\n", result);
	}
	return 0;
}
