#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#define DISABLE_MMAP
#define W while
#define gc getchar
#define pc putchar
#define I inline
const int N = 500010; int n, m, v[N], in[N], cnt[N], G[N], g[N], blo, ans[N];
int len, l = 1, r, now; bool vis[N]; int L[N], R[N];
const int SIZE=(1<<20)+1;
char buf[SIZE],*p1=buf,*p2=buf;
char buffer[SIZE];
int op1=-1;
const int op2=SIZE-1;
inline char readchar() {
if(p1!=p2) {
return *p1++;
}
return p1==(p2=(p1=buf)+fread(buf,1,SIZE-1,stdin))?EOF:*p1++;
}
inline void flush() {
fwrite(buffer,1,op1+1,stdout),op1=-1;
}
inline void writechar(const char &x) {
if(op1==op2) flush();
buffer[++op1]=x;
}
#ifndef ONLINE_JUDGE
#define readchar getchar
#endif
#define putchar writechar
inline int read() {
char c=readchar(); int x=0;
while(c<=32) {
c=readchar();
}
for(; ('0'<=c && c<='9'); c=readchar()) {
x=x*10+c-'0';
}
return x;
}
inline void write(int x) {
char s[25];
int n=0;
while(x || !n) {
s[n++]='0'+x%10,x/=10;
}
while(n--) {
writechar(s[n]);
}
}
struct Q {
int l, r, id;
friend bool operator < (const Q &a, const Q &b) {
return (in[a.l] != in[b.l]) ? (in[a.l] < in[b.l]) : ((in[a.l] & 1) ? a.r < b.r : a.r > b.r);
}
} q[N];
I void add(int x) {
cnt[x]++;
if(cnt[x] == 1) g[x]++, G[in[x]]++;
if(cnt[x] == 2) g[x]--, G[in[x]]--;
}
I void del(int x) {
cnt[x]--;
if(cnt[x] == 1) g[x]++, G[in[x]]++;
if(cnt[x] == 0) g[x]--, G[in[x]]--;
}
I int query() {
for(int i = 1; i <= blo; i++) if(G[i]) {
for(int j = L[i]; j <= R[i]; j++) if(g[j]) return j;
}
return 0;
}
int main() {
n = read(); for(int i = 1; i <= n; i++) v[i] = read(); int len = 700;
for(int i = 1; i <= 500000; i++) in[i] = (i + len - 1) / len; blo = in[500000];
for(int i = 1; i <= blo; i++) L[i] = (i - 1) * len + 1, R[i] = min(i * len, n);
m = read(); for(int i = 1; i <= m; i++) {q[i].l = read(), q[i].r = read(); q[i].id = i;}
sort(q + 1, q + 1 + m);
for(int i = 1; i <= m; i++) {
W(l > q[i].l) add(v[--l]);
W(r < q[i].r) add(v[++r]);
W(l < q[i].l) del(v[l++]);
W(r > q[i].r) del(v[r--]);
ans[q[i].id] = query();
}
for(int i = 1; i <= m; i++) write(ans[i]), writechar('\n');
flush();
return 0;
}
有没有什么比较省力的卡过去的技巧