请求加强此题数据,我莫队+O(n)暴力修改都卡过去了qwq
#include<bits/stdc++.h>
using namespace std;
const int N=10000010;
int n,m,t,a[N],pos[N],cnt[N],maxn;
int ans1,ans2,ans[N][2];
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
struct Mo {
int ql,qr,l,r,id;
bool operator <(const Mo &x)const {
return pos[ql]^pos[x.ql]?ql<x.ql:(pos[ql]&1)?qr<x.qr:qr>x.qr;
}
}q[N];
inline void add(int x) {
++cnt[x];
}
inline void del(int x) {
--cnt[x];
}
int main() {
n=read();m=read();
t=sqrt(n);
t=max(t,1);
for(int i=1;i<=n;++i) a[i]=read(),maxn=max(maxn,a[i]),pos[i]=(i-1)/t+1;
for(int i=1;i<=m;++i) {
q[i].ql=read();
q[i].qr=read();
q[i].l=read();
q[i].r=read();
q[i].id=i;
}
sort(q+1,q+1+m);
for(int i=1,l=1,r=0;i<=m;++i) {
while(l>q[i].ql) add(a[--l]);
while(l<q[i].ql) del(a[l++]);
while(r>q[i].qr) del(a[r--]);
while(r<q[i].qr) add(a[++r]);
int rr=min(maxn,q[i].r);
ans1=0,ans2=0;
for(int j=q[i].l;j<=rr;++j) {
ans1+=cnt[j];
if(cnt[j]) ans2++;
}
ans[q[i].id][0]=ans1;
ans[q[i].id][1]=ans2;
}
for(int i=1;i<=m;++i)
printf("%d %d\n",ans[i][0],ans[i][1]);
return 0;
}