记录编号 |
498402 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[AHOI 2013] 作业 |
最终得分 |
100 |
用户昵称 |
AntiLeaf |
是否通过 |
通过 |
代码语言 |
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;
}