You are given an array $a$ consisting of $n$ integers, and $q$ queries to it. $i$-th query is denoted by two integers $l_i$ and $r_i$. For each query, you have to find any integer that occurs exactly once in the subarray of $a$ from index $l_i$ to index $r_i$ (a subarray is a contiguous subsegment of an array). For example, if a=[1,1,2,3,2,4]a=[1,1,2,3,2,4], then for query (li=2,ri=6)(li=2,ri=6) the subarray we are interested in is [1,2,3,2,4][1,2,3,2,4], and possible answers are 11, 33 and 44; for query (li=1,ri=2)(li=1,ri=2) the subarray we are interested in is [1,1][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 $n$ ($1≤n≤5⋅10^5$,$1≤n≤5⋅10^5$).

The second line contains $n$ integers $a_1,a_2,…,a_n$ ($1≤a_i≤5⋅10^5$,$1≤a_i≤5⋅10^5$).

The third line contains one integer $q$ ($1≤q≤5⋅10^5$,$1≤q≤5⋅10^5$).

Then $q$ lines follow, $i$-th line containing two integers $l_i$ and $r_i$ representing $i$-th query ($1≤l_i≤r_i≤n$,$1≤l_i≤r_i≤n$).

Output

Answer the queries as follows:

If there is no integer such that it occurs in the subarray from index $l_i$ to index $r_i$exactly once, print $0$. Otherwise print any such integer.

Example

Input

6
1 1 2 3 2 4
2
2 6
1 2

Output

4
0

感想

  再也不敢熬夜了,通过熬夜换回了半夜两三个小时,后面几天我要用几十个小时去偿还,利息太高了……一道可以算做过的题,把我卡了那么多天……

解题思路

  先扔一个链接(HH的项链)//看不懂当年自己的博客什么鬼……这次借着做这题的机会,把当年的博客改得更好懂一点

  同样的思路,把询问离线,按左端点升序排序。搞一个nxt数组,nxt[i]记录下一个和a[i]相同的数字的位置,没有就赋值为inf(无穷大)。搞一棵线段树(树状数组啥的也行,只要能快速单点更新、查询区间最大值就好),记录区间内(nxt[i]最大)的i,代码里变量名是mxi,开始建树时不急着在树上存值,先把mxi全部赋值成0。

  然后,所有第一次出现的数字a[i]在线段树下标i的位置留下痕迹(用自己的nxt[i]去更新线段树,让线段树存下区间内所有留下痕迹的i中nxt[i]最大的i)。

  每次查询之前,先把询问的左端点以左的那些第一次出现的数字处理一下。如果他们的nxt[i]不是inf,就把他们的nxt[i]拿去在线段树上留下痕迹,然后清空他们自己留下的痕迹,查询时que函数会返回一个区间内nxt[i]最大的那个i,代码里变量名为temp,如果nxt[temp]都没超过询问区间的右端点,那么区间里没有只出现一次的数了,答案为0,否则答案就可以是a[temp],下一个相同的出现在区间外(inf也算区间外)。

  最后,把答案按照输入顺序排个序,输出,没了。

  和HH的项链那系列莫队板子题一样,莫队也可以(这题莫队好像要卡常?),主席树也能在线处理询问(我还不会)。

源代码

#include<stdio.h>
#include<algorithm> const int inf=0x7fffffff; int n,m;
int a[]={},mx=-,nxt[]={};
int p[]={};//类似一个桶,装第i号颜色第一次出现的位置 struct Segtree{
int l,r;
int mxi;//区间最大的nxt[i]对应的下标i
}t[];
inline int lson(int x){return x<<;}
inline int rson(int x){return x<<|;}
void maketree(int x,int l,int r)
{
if(l==r)
{
t[x]={l,r,};
return;
}
t[x].l=l;
t[x].r=r;
t[x].mxi=;
int mid=(l+r)>>;
maketree(lson(x),l,mid);
maketree(rson(x),mid+,r);
}
void update(int x,int pos)
{
if(pos>t[x].r||pos<t[x].l) return;
if(t[x].l==t[x].r)
{
t[x].mxi=pos;
return;
}
update(lson(x),pos);
update(rson(x),pos);
if(nxt[t[lson(x)].mxi]>nxt[t[rson(x)].mxi])
t[x].mxi=t[lson(x)].mxi;
else
t[x].mxi=t[rson(x)].mxi;
}
int que(int x,int l,int r)
{
if(l>t[x].r||r<t[x].l) return ;
if(l<=t[x].l&&t[x].r<=r)
return t[x].mxi;
int templ=que(lson(x),l,r),tempr=que(rson(x),l,r);
if(nxt[templ]>nxt[tempr]) return templ;
else return tempr;
} struct Ask{
int l,r,id,ans;
}ask[];
bool cmp1(const Ask & a,const Ask & b)
{
return a.l==b.l?a.r<b.r:a.l<b.l;
}
bool cmp2(const Ask & a,const Ask & b)
{
return a.id<b.id;
} int main()
{
//freopen("test.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",a+i),mx=std::max(a[i],mx);
for(int i=n;i>;i--)//预处理出nxt和p
{
if(p[a[i]]) nxt[i]=p[a[i]];
else nxt[i]=inf;
p[a[i]]=i;
}
maketree(,,n);
for(int i=;i<=mx;i++)
{
if(p[i]) update(,p[i]);//线段树单点更新
} scanf("%d",&m);
for(int i=,l,r;i<=m;i++)
{
scanf("%d%d",&l,&r);
ask[i]={l,r,i,};
}
std::sort(ask+,ask++m,cmp1); for(int i=,ll=;i<=m;i++)
{
while(ll<ask[i].l)
{
if(nxt[ll]!=0x7fffffff)
{
update(,nxt[ll]);
nxt[ll]=;
update(,ll);
}
ll++;
}
int temp=que(,ask[i].l,ask[i].r);//返回nxt最大的那个的下标
if(nxt[temp]<=ask[i].r) ask[i].ans=;
else ask[i].ans=a[temp];
} std::sort(ask+,ask++m,cmp2);
for(int i=;i<=m;i++)
printf("%d\n",ask[i].ans); return ;
}

CodeForces 1000F One Occurrence的更多相关文章

  1. codeforces 1000F One Occurrence(线段树、想法)

    codeforces 1000F One Occurrence 题意 多次询问lr之间只出现过一次的数是多少. 题解 将查询按照左端点排序,对于所有值维护它在当前位置后面第二次出现是什么时候,那么查询 ...

  2. Codeforces 1000F One Occurrence 主席树|| 离线+线段树

    One Occurrence 为什么我半年前这么菜呀, 这种场只A三题... 我们在主席树 || 线段树上维护每个数的右边和它一样的数在哪里, 然后就变成了区间求最大值. 注意加进去的时候要把它右边一 ...

  3. 【Codeforces 1000F】One Occurrence

    题意:给一个序列,每次查询某个区间内一个只出现一次的数. 思路:线段树. 首先我们看只出现一次的本质是什么. 如果一个数\(x​\)在\((l,r)​\)中只出现了一次,那么它在其中第一次出现位置为\ ...

  4. F - One Occurrence CodeForces - 1000F (线段树+离线处理)

    You are given an array aa consisting of nn integers, and qq queries to it. ii-th query is denoted by ...

  5. Codeforces 528D Fuzzy Search(FFT)

    题目 Source http://codeforces.com/problemset/problem/528/D Description Leonid works for a small and pr ...

  6. Codeforces 714C. Sonya and Queries Tire树

    C. Sonya and Queries time limit per test:1 second memory limit per test: 256 megabytes input:standar ...

  7. CodeForces - 427A (警察和罪犯 思维题)

    Police Recruits Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Sub ...

  8. Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset (0/1-Trie树)

    Vasiliy's Multiset 题目链接: http://codeforces.com/contest/706/problem/D Description Author has gone out ...

  9. Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)(A.思维题,B.思维题)

    A. Vicious Keyboard time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...

随机推荐

  1. P2476 [SCOI2008]着色方案

    传送门 数学太珂怕了--膜一下->这里 记\(sum[i]\)为题中\(c[i]\)的前缀和,\(C[i][j]\)表示\(C_{i}^j\) 设\(f[i][j]\)表示前面\(i\)中颜色已 ...

  2. 树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland

    题目传送门 /* 题意:求一个点为根节点,使得到其他所有点的距离最短,是有向边,反向的距离+1 树形DP:首先假设1为根节点,自下而上计算dp[1](根节点到其他点的距离),然后再从1开始,自上而下计 ...

  3. 状态压缩+枚举 UVA 11464 Even Parity

    题目传送门 /* 题意:求最少改变多少个0成1,使得每一个元素四周的和为偶数 状态压缩+枚举:枚举第一行的所有可能(1<<n),下一行完全能够由上一行递推出来,b数组保存该位置需要填什么 ...

  4. CDH搭建Hadoop分布式服务器集群(java新手小白)

    1首先对于一个java还白的小白,先理解CDH与Hadoop的关系 一.Hadoop版本选择. Hadoop大致可分为Apache Hadoop和第三方发行第三方发行版Hadoop,考虑到Hadoop ...

  5. .NET 错误 47 存储区提供程序工厂类型“Oracle.DataAccess.Client.OracleClientFactory”未实现 IServiceProvider 接口。请使用实现该接口的存储区提供程序。

    问题描述: 最近用VS2010连接ORACLE数据库的时候突然报错“错误 47 存储区提供程序工厂类型“Oracle.DataAccess.Client.OracleClientFactory”未实现 ...

  6. Python的I/O操作

    1.读取键盘输入 msg = raw_input("Please enter :") print "you input ",msg #可接受Python表达式作 ...

  7. python与arduino串口通讯对接opencv实现智能物品分拣

    2018-05-0118:53:50 先上图: 再来视频: http://v.youku.com/v_show/id_XMzU3NzAwNzMyNA==.html?spm=a2hzp.8244740. ...

  8. git reset作用

    git reset: 1. 文件从暂存区回退到工作区,撤销add 2. 版本回退  一:文件从暂存区回退到工作区,撤销add 如果想取消某个add的文件,可以使用该命令来进行撤销操作 撤消add:gi ...

  9. 【PostgreSQL-9.6.3】LOG: unrecognized configuration parameter "dynamic_shared_memory_type"

    报错如下: 输入如下命令启动PG数据库时,报错: [postgres@drz ~]$ pg_ctl -D /opt/postgresql/data/ start server starting FAT ...

  10. bower——基本使用

    基本概念 bower可以解决项目的静态文件依赖的问题 bower是用nodejs开发的,所以要现状nodejs 安装nodejs应用程序,网上自行下载 检验是否成功安装,打开电脑cmd,执行node ...