WA on #1~4 and #11~13
#include<bits/stdc++.h>
using namespace std;
int n,m,t,len;
int a[1000005],pos[1000005],uf[1000005];
int rt[100005],size[100005];
int q[500005][5],ans[500005];
int l[1255],r[1255],Max[1255],lazy[1255];
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
{
w=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
s=(s<<3)+(s<<1)+ch-'0';
ch=getchar();
}
return s*w;
}
inline void print(int x)
{
if(x==0)
{
return;
}
print(x/10);
putchar((char)((x%10)+(int)'0'));
}
int uf_ask(int x)
{
if(uf[x]==x)
{
return x;
}
else
{
uf[x]=uf_ask(uf[x]);
return uf[x];
}
}
int main()
{
//cin>>n>>m;
n=read(),m=read();
for(int i=1;i<=n;++i)
{
//cin>>a[i];
a[i]=read();
}
for(int i=1;i<=m;++i)
{
q[i][1]=read();
q[i][2]=read();
q[i][3]=read();
q[i][4]=read();
}
len=800;
t=n/len;
if(n%len!=0)
{
t++;
}
for(int i=1;i<=t;++i)
{
l[i]=(i-1)*len+1;
r[i]=i*len;
}
if(r[t]>n)
{
r[t]=n;
}
for(int i=1;i<=t;++i)
{
Max[i]=-1;
// for(int j=0;j<=100001;++j)
// {
// size[j]=0;
// rt[j]=0;
// }
memset(rt,0,sizeof(rt));
memset(size,0,sizeof(size));
for(int j=l[i];j<=r[i];++j)
{
Max[i]=max(Max[i],a[j]);
uf[j]=j;
size[a[j]]++;
if(rt[a[j]])
{
uf[j]=rt[a[j]];
}
else
{
rt[a[j]]=j;
}
}
for(int j=1;j<=m;++j)
{
if(q[j][2]>r[i]||q[j][3]<l[i])
{
continue;
}
if(q[j][4]>Max[i]+lazy[i])
{
continue;
}
if(q[j][1]==1)
{
if(q[j][2]<=l[i]&&r[i]<=q[j][3])
{
if((Max[i]+lazy[i])/2<q[j][4])
{
for(int k=q[j][4]+1-lazy[i];k<=Max[i];++k)
{
if(rt[k]==0)
{
continue;
}
if(rt[k-q[j][4]]==0)
{
rt[k-q[j][4]]=rt[k];
a[rt[k]]-=q[j][4];
rt[k]=0;
size[k-q[j][4]]=size[k];
size[k]=0;
}
else
{
uf[rt[k]]=rt[k-q[j][4]];
rt[k]=0;
size[k-q[j][4]]+=size[k];
size[k]=0;
}
}
Max[i]=q[j][4]-lazy[i];
}
else
{
for(int k=1-lazy[i];k<=q[j][4]-lazy[i];++k)
{
if(rt[k]==0)
{
continue;
}
if(rt[k+q[j][4]]==0)
{
rt[k+q[j][4]]=rt[k];
a[rt[k]]=k+q[j][4];
rt[k]=0;
size[k+q[j][4]]+=size[k];
size[k]=0;
}
else
{
uf[rt[k]]=rt[k+q[j][4]];
rt[k]=0;
size[k+q[j][4]]+=size[k];
size[k]=0;
}
}
lazy[i]-=q[j][4];
}
}
else
{
for(int k=l[i];k<=r[i];++k)
{
int w=a[uf_ask(k)];
a[k]=w+lazy[i];
size[w]=0;
rt[w]=0;
}
for(int k=max(l[i],q[j][2]);k<=min(r[i],q[j][3]);++k)
{
if(a[k]>q[j][4])
{
a[k]-=q[j][4];
}
}
Max[i]=-1;
lazy[i]=0;
//memset(rt,0,sizeof(rt));
//memset(size,0,sizeof(size));
for(int k=l[i];k<=r[i];++k)
{
Max[i]=max(Max[i],a[k]);
uf[k]=k;
size[a[k]]++;
if(rt[a[k]])
{
uf[k]=rt[a[k]];
}
else
{
rt[a[k]]=k;
}
}
}
}
else
{
if(q[j][4]-lazy[i]>100001)
{
continue;
}
//cout<<i<<' '<<j<<' '<<ans[j]<<' ';
if(q[j][2]<=l[i]&&r[i]<=q[j][3])
{
ans[j]+=size[q[j][4]-lazy[i]];
}
else
{
for(int k=max(l[i],q[j][2]);k<=min(r[i],q[j][3]);++k)
{
if(a[uf_ask(k)]+lazy[i]==q[j][4])
{
++ans[j];
}
}
}
//cout<<ans[j]<<endl;
}
}
}
for(int i=1;i<=m;++i)
{
if(q[i][1]==2)
{
if(!ans[i])
{
putchar('0');
}
else
{
print(ans[i]);
}
putchar('\n');
}
}
}
调了一周多了/kk