莫队线段树求助
查看原帖
莫队线段树求助
795344
lfxxx_楼主2024/10/18 08:40

rt,而且 O(qnlogV)O(q \sqrt{n} \log V) 应该是可以过的啊,或者请大佬调调块长

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,V=2e5,inf=0x3f3f3f3f;
struct query{int l,r,id;}q[N];
int sum[N<<2],pos[N<<2],a[N],L[N],R[N],poss[N],ans[N];
inline bool cmp(const query&q1,const query&q2){return poss[q1.l]!=poss[q2.l]?q1.l<q2.l:q1.r<q2.r;}
inline void pushup(const int&p)
{
	sum[p]=sum[p<<1]+sum[p<<1|1];
	pos[p]=min(pos[p<<1],pos[p<<1|1]); 
}
void build(const int&p,const int&pl,const int&pr)
{
	if(pl==pr)
	{
		pos[p]=pl;
		return ;
	}
	int mid=(pl+pr)>>1;
	build(p<<1,pl,mid);
	build(p<<1|1,mid+1,pr);
	pushup(p);
}
void update(const int&p,const int&pl,const int&pr,const int&x,const int&d)
{
	if(x<pl||pr<x)
		return ;
	if(pl==pr)
	{
		if(sum[p]==0)
			pos[p]=inf;
		sum[p]+=d;
		if(sum[p]==0)
			pos[p]=x;
		return ;
	}
	int mid=(pl+pr)>>1;
	update(p<<1,pl,mid,x,d);
	update(p<<1|1,mid+1,pr,x,d);
	pushup(p);
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); 
	int n,m;
	cin>>n>>m;
	const int tt=sqrt(n);
	int t=n/tt;
	for(int i=1;i<=n;++i)
		cin>>a[i];
	build(1,0,V);
	for(int i=1;i<=t;++i)
		L[i]=(i-1)*t+1,R[i]=i*t;
	if(R[t]<n)
	{
		++t;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(int i=1;i<=t;++i)
		for(int j=L[i];j<=R[i];++j)
			poss[j]=i;
	for(int i=1;i<=m;++i)
		cin>>q[i].l>>q[i].r,q[i].id=i;
	sort(q+1,q+m+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=m;++i)
	{
		while(l>q[i].l)
		{
			--l;
			update(1,0,V,a[l],1);
		}
		while(r>q[i].r)
		{
			update(1,0,V,a[r],-1);
			--r;
		}
		while(r<q[i].r)
		{
			++r;
			update(1,0,V,a[r],1);
		}
		while(l<q[i].l)
		{
			update(1,0,V,a[l],-1);
			++l;
		}
		ans[q[i].id]=pos[1];
	}
	for(int i=1;i<=m;++i)
		cout<<ans[i]<<'\n';
}
2024/10/18 08:40
加载中...