rt,注意了要先add
,其他的地方不知道为什么错了,看了题解,查不出来哪里错了/ll
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-') f=0;c=getchar();}
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return f?x:-x;
}
const int N=1e5+5,M=2e4+5;
struct node{int l,r,id,bl;}q[N];
bool cmp(node x,node y){return x.bl!=y.bl?x.l<y.l:((x.bl&1)?x.r<y.r:x.r>y.r);}
int n,m,blsiz,a[N],b[N],sum[N],l=1,r,tot,len[N],vis[N];
bitset<N>ans[M],cnt;
void del(int x){sum[a[x]]--;cnt[a[x]-sum[a[x]]]=0;}
void add(int x){cnt[a[x]+sum[a[x]]]=1;sum[a[x]]++;}
void sol(int x)
{
m/=5; tot=0; l=1; r=0; cnt.reset();
memset(sum,0,sizeof(sum));
for(int i=1;i<=x;i++)
{
len[i]=vis[i]=0;
for(int j=1;j<=3;j++)
{
int l=read(),r=read();
tot++;
q[tot]={l,r,i,(i-1)/blsiz+1};
len[i]+=r-l+1;
}
}
sort(q+1,q+tot+1,cmp);
for(int i=1;i<=tot;i++)
{
while(l>q[i].l) add(--l);
while(r<q[i].r) add(++r);
while(l<q[i].l) del(l++);
while(r>q[i].r) del(r--);
if(!vis[q[i].id]){ans[q[i].id]=cnt;vis[q[i].id]=1;}
else ans[q[i].id]&=cnt;
}
for(int i=1;i<=x;i++) printf("%lld\n",len[i]-3*ans[i].count());
}
signed main()
{
n=read(),m=read();
blsiz=n/sqrt(m);
for(int i=1;i<=n;i++) a[i]=b[i]=read();
sort(b+1,b+n+1);
for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+n+1,a[i])-b;
while(m)
{
if(m/5) sol(m/5);
else sol(m);
}
return 0;
}