#include #include using namespace std; struct Cislo { int cislo; int index; // index, kde je na vstupu int soused; // index nejblizsiho stejnyho cisla }; int comparator(const void *a, const void *b) { static int rozdil; // rozdil = (*((Cislo**)a))->cislo - (*((Cislo**)b))->cislo; if(rozdil != 0) return rozdil; //else return (*((Cislo**)a))->index - (*((Cislo**)b))->index; } int main() { bool ok; int m, q, from, to; Cislo *cisla = new Cislo[1000000]; Cislo **serazena_cisla = new Cislo*[1000000]; while(1) { cin >> m >> q; // nacteni M if(m==0 && q==0) break; for(int i = 0; i < m; i++) { cisla[i].index = i; cin >> cisla[i].cislo; } // spocitam si sousedy for(int i = 0; i < m; i++) // kopie, kterou seradim serazena_cisla[i] = &(cisla[i]); qsort(serazena_cisla, m, sizeof(Cislo*), comparator); // seradim for(int i = 0, im = m-1; i < im; i++) // projdu serazeny, spocitam sousedy { if(serazena_cisla[i]->cislo == serazena_cisla[i+1]->cislo) serazena_cisla[i]->soused = serazena_cisla[i+1]->index; else serazena_cisla[i]->soused = 1000001; } serazena_cisla[m-1]->soused = 1000001; /*for(int i = 0; i < m; i++) { cout << '[' << cisla[i].cislo << ',' << cisla[i].soused << ']'; } cout << endl;*/ /*for(int i = 0; i < m; i++) cout << serazena_cisla[i]->cislo << ' '; cout << endl;*/ // kontrola intervalu for(int i = 0; i < q; i++) { ok = true; cin >> from >> to; for(int s = from-1, sm = to-1; s < sm; s++) { if(cisla[s].soused < to) { cout << cisla[s].cislo << '\n'; ok = false; break; } } if(ok) cout << "OK\n"; } cout << '\n'; } delete [] cisla; return 0; }