萌新写Ynoi被虐哭了呜呜呜
超时是在询问,怎么卡都稳定超时
#include<bits/stdc++.h>
#define itn int
#define tin int
#define nit int
#define tni int
#define nti int
#define scnaf scanf
#define ptrinf printf
#define icn cin
#define cni cin
#define inc cin
#define nci cin
#define nic cin
#define cuot cout
#define ocut cout
#define fro for
using namespace std;
const int N=5e5+5,ghN=3100;
int n,m,a[N],l[N],L[ghN],R[ghN],f[ghN][ghN],block,tot,belong[N],cnt[N],lastans;
vector<int>v[N];
inline void lsh()
{
sort(l+1,l+1+n);
int cnt=unique(l+1,l+n+1)-l-1;
for(register int i=1;i<=n;i++)
a[i]=lower_bound(l+1,l+cnt+1,a[i])-l;
return;
}
inline void init()
{
block=sqrt(n*log2(n));
tot=(n-1)/block+1;
for(register int i=1;i<=tot;i++)
L[i]=R[i-1]+1,R[i]=i*block;
R[tot]=n;
for(register int i=1;i<=tot;i++)
for(register int j=L[i];j<=R[i];j++)
belong[j]=i;
return;
}
inline void pre(int x)
{
memset(cnt,0,sizeof cnt);
int mode=0,maxx=0;
for(register int i=L[x];i<=n;i++)
{
int t=belong[i];
cnt[a[i]]++;
if(cnt[a[i]]>maxx||(cnt[a[i]]==maxx&&a[i]<mode))
{
mode=a[i];
maxx=cnt[a[i]];
}
f[x][t]=mode;
}
return;
}
inline int solve(int l,int r,int a)
{
int x=upper_bound(v[a].begin(),v[a].end(),r)-v[a].begin();
int y=lower_bound(v[a].begin(),v[a].end(),l)-v[a].begin();
return x-y;
}
inline int query(int l,int r)
{
if(belong[l]==belong[r])
{
int maxx=0,mode=0;
for(register int i=l;i<=r;i++)
{
int tmp=solve(l,r,a[i]);
if(tmp>maxx||(tmp==maxx&&a[i]<mode))
{
maxx=tmp;
mode=a[i];
}
}
return maxx;
}
int p=belong[l],q=belong[r];
int mode=f[p+1][q-1];
int maxx=solve(l,r,mode);
for(register int i=l;i<=R[p];i++)
{
int tmp=solve(l,r,a[i]);
maxx=max(tmp,maxx);
}
for(register int i=r;i>=L[q];i--)
{
int tmp=solve(l,r,a[i]);
maxx=max(maxx,tmp);
}
return maxx;
}
inline int read()
{
char ch=getchar();int s=0,w=1;
while(ch<'0' || ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0' && ch<='9'){s=s*10+ch-48;ch=getchar();}
return s*w;
}
int main()
{
clock_t c1=clock();
#ifdef LOCAL
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
n=read(),m=read();
for(register int i=1;i<=n;i++)l[i]=a[i]=read();
lsh();
init();
for(register int i=1;i<=tot;i++)
pre(i);
// return 0;
for(register int i=1;i<=n;i++)
v[a[i]].push_back(i);
// return 0;
while(m--)
{
int l=read(),r=read();
l^=lastans,r^=lastans;
printf("%d\n",(lastans=query(l,r)));
}
#ifdef LOCAL
cerr<<"Time used:"<<clock()-c1<<"ms";
#endif
return 0;
}