#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SIZEOF(a) (sizeof(a)/sizeof(a[0])) #define FILL(a, b) fill (a,a+SIZEOF(a),b) #define FOR(a,b,c) for(int a=b; a<=c; a++) #define FORARR(i,a) for(usigned i=0; i 0) { vector events; map positions; // num -> position in the list FOR(i,0,M-1) { // nacist klice int K; scanf("%d", &K); map::iterator f = positions.find(K); if (f == positions.end()) { positions[K] = i; } else { events.push_back(event(IB, 2*(f->second+1)+1, interval(f->second+1, i+1, K))); positions[K] = i; } } FOR(j,0,Q-1) { // pozadavky int B, E; scanf("%d %d", &B, &E); events.push_back(event(QB, 2*B, interval(B, E, j))); events.push_back(event(QE, 2*E, interval(B, E, j))); } sort(events.begin(), events.end()); map openQueries; vector queryResults(Q, -1); FOREACH(e, events) { // printf("event: "); if (e->type == QB) { // printf("QB, %d, %d %d\n", e->pos, e->i.begin, e->i.end); openQueries[e->i.num] = e->i; } else if (e->type == QE) { // printf("QE, %d, %d %d\n", e->pos, e->i.begin, e->i.end); openQueries.erase(e->i.num); // queryResults[e->i.num] = -1; // neni treba } else { // IB vector toDelete; // printf("IB, %d, %d %d %d\n", e->pos, e->i.begin, e->i.end, e->i.num); FOREACH(q, openQueries) { if (e->i.end <= q->second.end) { // interval padl do query //#ifdef DEBUG // printf("interval %d %d num %d padol do query %d %d\n",e->i.begin, e->i.end, e->i.num, q->second.begin, q->second.end); //#endif queryResults[q->second.num] = e->i.num; toDelete.push_back(e->i.num); } } FOREACH(bz,toDelete) { openQueries.erase(*bz); } } } FOR(i,0,Q-1) { if (queryResults[i] >= 0) { printf("%d\n", queryResults[i]); } else { printf("OK\n"); } } printf("\n"); } return 0; }