1. 程式人生 > >Educational Codeforces Round 46 (Rated for Div. 2) F. One Occurrence

Educational Codeforces Round 46 (Rated for Div. 2) F. One Occurrence

F. One Occurrence

time limit per test

3 seconds

memory limit per test

768 megabytes

input

standard input

output

standard output

You are given an array aa consisting of nn integers, and qq queries to it. ii-th query is denoted by two integers lili and riri. For each query, you have to find any integer that occurs exactly once in the subarray of aa from index lili to index riri (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 nn (1≤n≤5⋅1051≤n≤5⋅105).

The second line contains nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤5⋅1051≤ai≤5⋅105).

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

Then qq lines follow, ii-th line containing two integers lili and riri representing ii-th query (1≤li≤ri≤n1≤li≤ri≤n).

Output

Answer the queries as follows:

If there is no integer such that it occurs in the subarray from index lili to index riri exactly once, print 00. Otherwise print any such integer.

Example

input

Copy

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

output

Copy

4
0

莫隊用了各種優化  

一開始無限TLE,看了別人過的程式碼 發現基本沒啥不同

  最後竟然發現 vis 陣列的型別如果是int 型 就會很大機率TLE ,char 型 和 bool 型  就能過  感覺好像是對比位元組長度不同 花費的時間也會不同 。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<queue>
#include<set>
using namespace std;

const int Maxn = 500500;

struct node
{
	int l,r,ID,num;
}q[Maxn];

int ans[Maxn],kind[Maxn];
int as[Maxn];
bool vis[Maxn];

int b,n,m;
inline bool cmp(const node &x,const node &y)
{
    if (x.l/b<y.l/b)
        return 1;
    if (x.l/b>y.l/b)
        return 0;
    return ((x.l/b)&1)?x.r<y.r:x.r>y.r;
}

vector <int >vec;

inline void modify(int x,int add){
/*
	if(kind[a[i]])
		sum --;
*/
	kind[ans[x]] += add;

	if(kind[ans[x]] == 1 && vis[ans[x]] == 0)
    {
        vec.push_back(ans[x]);
        vis[ans[x]] = 1;
    }
}

inline void Read(int &x)
{
    char c=getchar();
    x=0;
    while (c<'0'||c>'9')
    {

        c=getchar();
    }
    while (c>='0'&&c<='9')
    {
        x=x*10+c-'0';
        c=getchar();
    }

}

inline void Out(int a)    //輸出一個整型
{
    if(a<0)
    {
          putchar('-');
          a=-a;
    }
    if(a>9)
    Out(a/10);
    putchar(a%10+'0');
}


int main()
{


	Read(n);

    b = sqrt(n);

	for(int i = 1;i <= n;++ i){
		Read(ans[i]);
    }
    Read(m);
	for(int i = 1;i <= m;++ i){
		Read(q[i].l);
		Read(q[i].r);
		q[i].ID = i;
	}

	sort(q+1,q+1+m,cmp);

	int l = 1,r = 0;

    vec.push_back(0);
    kind[0] = 1;
	for(int i = 1;i <= m;++ i){

		while(l > q[i].l){modify(--l,1);}
		while(l < q[i].l){modify(l++,-1);}
		while(r < q[i].r){modify(++r,1);}
		while(r > q[i].r){modify(r--,-1);}

		while(kind[vec.back()] != 1)
        {
            vis[vec.back()] = 0;
            vec.pop_back();
        }

        as[q[i].ID] = vec.back();
	}

	for(int i = 1;i <= m;++ i){
		Out(as[i]);
		putchar('\n');
	}

    return 0;
}