您的位置:首页 > 其它

bzoj 3339: Rmq Problem

2016-03-31 22:33 253 查看
莫队+对值分块查找;

#include<bits/stdc++.h>
#define rep(i,k,n) for(int i=k;i<=(n);i++)
using namespace std;
const int maxn=200005;
int a[maxn],have[maxn],sum[maxn],n,s,m;
struct Q{
int l,r,ans,id;
}q[maxn];
bool cmp(Q a,Q b){return a.l/s==b.l/s ? a.r<b.r : a.l/s<b.l/s;}
bool cmp_id(Q a,Q b){return a.id<b.id;}
void solve(){
int l=1,r=0;
rep(i,1,m){
for(;r<q[i].r;r++){if(!sum[a[r+1]])have[a[r+1]/s]++;sum[a[r+1]]++;}
for(;r>q[i].r;r--){if(!(--sum[a[r]]))have[a[r]/s]--;}
for(;l>q[i].l;l--){if(!sum[a[l-1]])have[a[l-1]/s]++;sum[a[l-1]]++;}
for(;l<q[i].l;l++){if(!(--sum[a[l]]))have[a[l]/s]--;}
rep(k,0,s)if(have[k]!=s){
rep(j,s*k,s*(k+1)-1)
if(!sum[j])
{q[i].ans=j;break;}
break;
}
}
}
int main(){//freopen("in.in","r",stdin);
scanf("%d%d",&n,&m);s=sqrt(n)+1;
rep(i,1,n)scanf("%d",&a[i]);
rep(i,1,m){scanf("%d%d",&q[i].l,&q[i].r);q[i].id=i;}
sort(q+1,q+1+m,cmp);
solve();
sort(q+1,q+1+m,cmp_id);
rep(i,1,m)printf("%d\n",q[i].ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: