求大佬看看吧。。。调了一天了。。。
#include<bits/stdc++.h>
#define hor(i,l,r) for(int i=l;i<=r;i++)
#define lor(i,l,r) for(int i=l;i>=r;i--)
#define un unsigned
#define fr front
#define se second
#define fi first
#define pb push_back
using namespace std;
template<typename T> inline void read(T &x){
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
template<typename T> inline void write(T x){
short st[30],tp=0;
if(x<0) putchar('-'),x=-x;
do st[++tp]=x%10,x/=10; while(x);
while(tp) putchar('0'|st[tp--]);
}
#define wr write
#define rd read
#define pk putchar(' ')
#define ed puts("")
bitset<100010>Ans[40001],u;
int l,r,tot,a[1000001],len[1000001],b[1000001],mp[1000001],bl;
bool vis[500001];
struct node{
int l,r,id;
}qs[500001];
bool cmp(node a,node b){
if((a.l-1)/bl==(b.l-1)/bl) return a.r<b.r;
return a.l<b.l;
}
void add(int p)
{
u[p+(mp[p]++)]=1;
}
void del(int p)
{
u[p+(--mp[p])]=0;
}
void solve(int ll,int rr){
if(ll>rr) return;
u.reset();
memset(mp,0,sizeof(mp));
memset(vis,0,sizeof(vis));
sort(qs+ll*3-2,qs+rr*3+1,cmp);
hor(i,ll,rr) Ans[i-ll].reset();
l=r=1,add(1);
hor(i,ll*3-2,rr*3){
// wr(qs[i].l),pk,wr(qs[i].r),ed;
while(r<qs[i].r) add(a[++r]);
while(r>qs[i].r) del(a[r--]);
while(l>qs[i].l) add(a[--l]);
while(l<qs[i].l) del(a[l++]);
// wr(l),pk,wr(r),ed;
if(vis[qs[i].id-ll]) Ans[qs[i].id-ll]&=u;
else Ans[qs[i].id-ll]=u,vis[qs[i].id-ll]=1;
}
hor(i,ll,rr){
//wr(len[i]),ed;
wr(len[i]-3*Ans[i-ll].count()),ed;
}
}
signed main(){
int n,m;
rd(n),rd(m);
bl=sqrt(n);
hor(i,1,n) rd(a[i]),b[i]=a[i];
sort(b+1,b+n+1);
hor(i,1,n) a[i]=lower_bound(b+1,b+n+1,a[i])-b;
hor(i,1,m){
hor(j,1,3){
rd(qs[++tot].l),rd(qs[tot].r);
qs[tot].id=i;
len[i]+=(qs[tot].r-qs[tot].l+1);
}
}
solve(1,m/3),solve(m/3+1,2*m/3),solve(2*m/3+1,m);
}