为什么下面 AC 代码中打标记的两行换成注释的两行就会 WA?历史研究写的那注释的两行的写法都 A 了。
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define rll register ll
#define cll const ll
#define N 200005
using namespace std;
inline ll read()
{
rll x=0;bool f=1;register char c=getchar();
while(c<48||c>57){if(c=='-') f=0;c=getchar();}
while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
return f?x:-x;
}
inline void write(ll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+48);
}
cll n=read(),L=sqrt(n);
ll m,nv,now,a[N],b[N],bl[N],br[N],val[N],ans[N],maxn[N],minn[N],mint[N];
struct tmp{ll l,r,id;}q[N];
inline bool cmp(tmp x,tmp y)
{
if(b[x.l]==b[y.l])
return x.r<y.r;
return b[x.l]<b[y.l];
}
inline void addr(ll x)
{
maxn[a[x]]=x;
if(!minn[a[x]]) minn[a[x]]=x;
now=max(now,maxn[a[x]]-minn[a[x]]);
}
inline void addl(ll x)
{
if(!maxn[a[x]]) maxn[a[x]]=x;
now=max(now,maxn[a[x]]-x);
}
inline void del(ll x)
{
maxn[a[x]]=0;
minn[a[x]]=0;
}
inline void dell(ll x)
{
if(maxn[a[x]]==x)
maxn[a[x]]=0;
}
int main()
{
for(rll i=1;i<=(n+L-1)/L;i++)
{
bl[i]=br[i-1]+1,br[i]=min(bl[i]+L-1,n);
for(rll j=bl[i];j<=br[i];j++)
a[j]=val[j]=read(),b[j]=i;
}
sort(val+1,val+n+1);
nv=unique(val+1,val+n+1)-val-1;
for(rll i=1;i<=n;i++)
a[i]=lower_bound(val+1,val+nv+1,a[i])-val;
m=read();
for(rll i=1;i<=m;i++)
{
q[i].l=read(),q[i].r=read();
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
for(rll i=1,l=1,r=0,tmp,last=0;i<=m;i++)
{
if(b[q[i].l]==b[q[i].r])
{
for(rll j=q[i].l;j<=q[i].r;j++)
{
if(!mint[a[j]]) mint[a[j]]=j;
ans[q[i].id]=max(ans[q[i].id],j-mint[a[j]]);
}
for(rll j=q[i].l;j<=q[i].r;j++)
mint[a[j]]=0;
continue;
}
if(b[q[i].l]!=last)
{
for(rll j=1;j<=nv;j++)
maxn[j]=minn[j]=0;
l=br[b[q[i].l]]+1; //←
r=br[b[q[i].l]]; //←
//while(l<br[b[q[i].l]]+1) l++;
//while(r>br[b[q[i].l]]) r--;
now=0;
last=b[q[i].l];
}
while(r<q[i].r) addr(++r);
tmp=now;
l=br[b[q[i].l]]+1;
while(l>q[i].l) addl(--l);
ans[q[i].id]=now;
now=tmp;
while(l<br[b[q[i].l]]+1)
dell(l++);
}
for(rll i=1;i<=m;i++)
write(ans[i]),putchar('\n');
return 0;
}