3339: Rmq Problem

Time Limit: 20 Sec  Memory Limit: 128 MB

Submit: 1362  Solved: 721

[​​Submit​​​][​​Status​​​][​​Discuss​​]

Description

Input

Output

Sample Input

7 5
0 2 1 0 1 3 2
1 3
2 3
1 4
3 6
2 7

Sample Output

3
0
3
2
4

HINT

 

 

Source

​By Xhr​

 

3585: mex

Time Limit: 20 Sec  Memory Limit: 128 MB

Submit: 1198  Solved: 615

[​​Submit​​​][​​Status​​​][​​Discuss​​]

Description

  有一个长度为n的数组{a1,a2,...,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。

Input

  第一行n,m。
  第二行为n个数。
  从第三行开始,每行一个询问l,r。

Output

  一行一个数,表示每个询问的答案。

Sample Input

5 5
2 1 0 2 1
3 3
2 3
2 4
1 2
3 5

Sample Output

1
2
3
0
3

HINT

 

数据规模和约定

  对于100%的数据:

  1<=n,m<=200000

  0<=ai<=109

  1<=l<=r<=n


  对于30%的数据:


  1<=n,m<=1000

 

Source

​By 佚名提供​

 

哈哈哈竟然BZOJ上有两道一模一样的题哈哈哈哈哈 可惜是两道权限题(⊙_⊙)

1 #include "bits/stdc++.h"
2 using namespace std;
3 typedef long long LL;
4 const int MAX=2e5+5;
5 int n,m;
6 int a[MAX],b[MAX],pos[MAX],an[MAX],bas,ans;
7 struct Node{
8 int id;
9 int l,r;
10 bool operator < (const Node &tt) const {
11 if (pos[l]!=pos[tt.l])
12 return pos[l]<pos[tt.l];
13 return r<tt.r;
14 }
15 }que[MAX];
16 inline int read(){
17 int an=0,x=1;char c=getchar();
18 while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();}
19 while (c>='0' && c<='9') {an=an*10+c-'0';c=getchar();}
20 return an*x;
21 }
22 void update(int x,int y){
23 if (a[x]>n) return;
24 b[a[x]]+=y;
25 if (!b[a[x]]){
26 if (a[x]<ans)
27 ans=a[x];
28 }
29 else if (a[x]==ans){
30 while (b[ans]) ans++;
31 }
32 }
33 int main(){
34 freopen ("mex.in","r",stdin);
35 freopen ("mex.out","w",stdout);
36 int i,j;
37 n=read();m=read();bas=(int)sqrt(n*1.0);
38 for (i=1;i<=n;i++) a[i]=read(),pos[i]=i/bas;
39 memset(b,0,sizeof(b));
40 for (i=1;i<=m;i++){
41 que[i].id=i;
42 que[i].l=read(),que[i].r=read();
43 }
44 sort(que+1,que+m+1);
45 int L=1,R=0;
46 for (i=1;i<=m;i++){
47 while (R<que[i].r) update(++R,1);
48 while (L>que[i].l) update(--L,1);
49 while (R>que[i].r) update(R--,-1);
50 while (L<que[i].l) update(L++,-1);
51 an[que[i].id]=ans;
52 }
53 for (i=1;i<=m;i++)
54 printf("%d\n",an[i]);
55 return 0;
56