记录编号 498402 评测结果 AAAAAAAAAA
题目名称 [AHOI 2013] 作业 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 2.964 s
提交时间 2018-06-13 21:38:10 内存使用 49.95 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000005,B=233,maxb=maxn/B+5;
struct Q{
	int l,r,a,b,id,lb;
	bool operator<(const Q &q)const{
		if(lb!=q.lb)return lb<q.lb;
		return r<q.r;
	}
}q[maxn];
struct block{
	int a[maxn],b[maxb];
	void add(int,int);
	int query(int,int);
}DS1,DS2;
void add(int);
void del(int);
int n,m,a[maxn],id[maxn],L[maxb],R[maxb],c[maxn],ans1[maxn],ans2[maxn];
int main(){
	freopen("ahoi2013_homework.in","r",stdin);
	freopen("ahoi2013_homework.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		id[i]=(i-1)/B+1;
		if(!L[id[i]])L[id[i]]=i;
		R[id[i]]=i;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d%d%d",&q[i].l,&q[i].r,&q[i].a,&q[i].b);
		q[i].id=i;
		q[i].lb=id[q[i].l];
	}
	sort(q+1,q+m+1);
	int l=2,r=1;
	for(int i=1;i<=m;i++){
		for(int j=l-1;j>=q[i].l;j--)add(a[j]);
		for(int j=r+1;j<=q[i].r;j++)add(a[j]);
		for(int j=l;j<q[i].l;j++)del(a[j]);
		for(int j=r;j>q[i].r;j--)del(a[j]);
		ans1[q[i].id]=DS1.query(q[i].a,q[i].b);
		ans2[q[i].id]=DS2.query(q[i].a,q[i].b);
		l=q[i].l;r=q[i].r;
	}
	for(int i=1;i<=m;i++)printf("%d %d\n",ans1[i],ans2[i]);
	return 0;
}
void add(int x){
	DS1.add(x,1);
	if(!c[x]++)DS2.add(x,1);
}
void del(int x){
	DS1.add(x,-1);
	if(!--c[x])DS2.add(x,-1);
}
void block::add(int x,int d){
	a[x]+=d;
	b[id[x]]+=d;
}
int block::query(int l,int r){
	int ans=0;
	if(id[l]==id[r]){
		while(l<=r)ans+=a[l++];
		return ans;
	}
	while(l!=L[id[l]])ans+=a[l++];
	while(r!=R[id[r]])ans+=a[r--];
	for(int i=id[l];i<=id[r];i++)ans+=b[i];
	return ans;
}