You are given an array [1,1], and there is no such element that occurs exactly once.

Can you answer all of the queries?

Input

The first line contains one integer 1≤n≤5⋅105).

The second line contains 1≤ai≤5⋅105).

The third line contains one integer 1≤q≤5⋅105).

Then 1≤li≤ri≤n).

Output

Answer the queries as follows:

If there is no integer such that it occurs in the subarray from index 0. Otherwise print any such integer.

Example

Input
6 
1 1 2 3 2 4
2
2 6
1 2
Output
4
0
题意:题目意思是给你N个数,然后有Q个询问每个询问给你一个区间,然后问你是否存在一个数只出现一次,若存在,则输出任意一个出现一次的数,否则输出0;
题解:我们离线处理,将所有询问按有边界小的排序,然后对于每一个新加入的数字,判断它上一次出现的位置,直到当前区间的有边界,然后判断在该区间是否
存在一个数上一次出现的位置比该区间的左边界 L 小。对于出现多次的我们只保留最近的一次,对于前面的赋值INF即可,
参考代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=5e5+10;
 4 const int INF=0x3f3f3f3f;
 5 typedef pair<int,int> PII;
 6 int n,q,a[maxn],pos[maxn],ans[maxn];
 7 struct Node{
 8     int l,r,id;
 9 } node[maxn];
10 
11 struct Tree{
12     int l,r;
13     PII Min_num;
14 } tree[maxn<<2];
15 
16 bool cmp(Node a,Node b)
17 {
18     return a.r==b.r? a.l<b.l : a.r<b.r;
19 }
20 
21 inline void build(int l,int r,int pos)
22 {
23     tree[pos].l=l,tree[pos].r=r;
24     if(l==r) return;
25     int mid=(tree[pos].l+tree[pos].r)>>1;
26     build(l,mid,pos<<1);
27     build(mid+1,r,pos<<1|1);
28 }
29 
30 inline void update(int k,int pre,int pos)
31 {
32     if(tree[k].l==tree[k].r)
33     {
34         tree[k].Min_num=PII(pre,pos);
35         return ;
36     }
37     int mid=(tree[k].l+tree[k].r)>>1;
38     if(pos<=mid) update(k<<1,pre,pos);
39     else update(k<<1|1,pre,pos);
40     tree[k].Min_num=min(tree[k<<1].Min_num,tree[k<<1|1].Min_num);
41 }
42 
43 inline PII getmin(int k,int l,int r)
44 {
45     if(tree[k].l==l && tree[k].r==r) return tree[k].Min_num;
46     int mid=(tree[k].l+tree[k].r)>>1;
47     if(r<=mid) return getmin(k<<1,l,r);
48     else if(l>=mid+1) return getmin(k<<1|1,l,r);
49     else return min(getmin(k<<1,l,mid),getmin(k<<1|1,mid+1,r));
50 }
51 
52 int main()
53 {
54     scanf("%d",&n);
55     memset(pos,0,sizeof pos);
56     memset(ans,0,sizeof ans);
57     for(int i=1;i<=n;i++) scanf("%d",a+i);
58     
59     scanf("%d",&q);
60     for(int i=1;i<=q;i++) scanf("%d%d",&node[i].l,&node[i].r),node[i].id=i;
61     sort(node+1,node+1+q,cmp);
62     build(1,n,1);
63     
64     for(int i=1,j=1;i<=n;i++)
65     {
66         if(pos[a[i]]) update(1,INF,pos[a[i]]);
67         update(1,pos[a[i]],i);
68         for(;i==node[j].r&&j<=q;j++)
69         {
70             PII temp=getmin(1,node[j].l,node[j].r);
71             if(temp.first<node[j].l) ans[node[j].id]=a[temp.second];
72         }
73         pos[a[i]]=i;
74     }
75     
76     for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
77     
78     return 0;
79 }
View Code

 

相关文章:

  • 2021-12-28
  • 2021-08-08
  • 2021-07-10
  • 2021-04-14
  • 2021-07-05
  • 2022-03-01
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-17
  • 2021-06-30
  • 2022-12-23
  • 2021-08-09
  • 2022-01-29
相关资源
相似解决方案