题面是截图不好发哇QAQ
同bzoj3585,甚至不用处理大于n的情况
这题时限20s我19.5s好险啊QAQ
#include<bits/stdc++.h>
using namespace std;
int n , Q , k;
int a[201000] , belong[201000];
int flag[201000];
int sum[500] , t;//k=块的大小 对数字进行分块
struct data{
int l , r , id;
}q[201000];
int read()
{
int sum = 0;char c = getchar();bool flag = true;
while( c < '0' || c > '9' ) {if(c == '-') flag = false;c = getchar();}
while( c >= '0' && c <= '9' ) sum = sum * 10 + c - 48 , c = getchar();
if(flag) return sum;
else return -sum;
}
bool mycmp(data a,data b)
{
return belong[a.l] < belong[b.l]||
(belong[a.l] == belong[b.l] && a.r < b.r);
}
void init()
{
n = read();Q = read();
for(int i = 1;i <= n;++i)
{
a[i] = read();
if(a[i] > n) a[i] = n;
}
for(int i = 1;i <= Q;++i)
q[i].l = read() , q[i].r = read() , q[i].id = i;
k = sqrt(n);
if(k * k < n) t = k + 1,sum[t] = k*k + k - n;
else t = k;
for(int i = 1,j = k,t = 1;i <= n;i += k,j += k,t++)
if(j <= n) for(int x = i;x <= j;++x) belong[x] = t;
else for(int x = i;x <= n;++x) belong[x] = t;
sort(q + 1,q + Q + 1,mycmp);
return;
}
void add(int x)
{
x = a[x];
if(flag[x] == 0) sum[belong[x]]++;
flag[x]++;
return;
}
void dele(int x)
{
x = a[x];
if(flag[x] == 1) sum[belong[x]]--;
flag[x]--;
return;
}
int print()
{
if(!flag[0]) return 0;
int i;
for(i = 1;i <= t;++i)
if(sum[i] != k)
break;
for(int j = (i - 1) * k + 1;i <= i * k;++i)
if(!flag[i]) return i;
}
int out[201000];
void solve()
{
int l = 1,r = 0;
for(int i = 1;i <= Q;++i)
{
while(l > q[i].l) l-- , add(l);
while(r < q[i].r) r++ , add(r);
while(l < q[i].l) dele(l) , l++;
while(r > q[i].r) dele(r) , r--;
out[q[i].id] = print();
}
for(int i = 1;i <= Q;++i)
printf("%d\n",out[i]);
return;
}
int main()
{
init();
solve();
return 0;
}