比赛 |
20190521热身赛 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
迷妹 |
最终得分 |
100 |
用户昵称 |
BYVoid |
运行时间 |
4.693 s |
代码语言 |
C++ |
内存使用 |
10.70 MiB |
提交时间 |
2019-05-21 18:34:27 |
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<cstring>
#define maxn 100005
using namespace std;
int n,q,t;
int a[maxn];
int L[maxn],R[maxn],pos[maxn];
struct POS{
int sum1,sum2,sum3;
}sum[maxn];
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-'0';
ch=getchar();
}
return x*f;
}
int main()
{
freopen("fans.in","r",stdin);
freopen("fans.out","w",stdout);
//scanf("%d%d",&n,&q);
n=read();q=read();
for(int i=1;i<=n;i++)//scanf("%d",&a[i]);
a[i]=read();
t=sqrt(n);
for(int i=1;i<=t;i++){
L[i]=(i-1)*t+1;
R[i]=i*t;
}
if(R[t]<n)t++,L[t]=R[t-1]+1,R[t]=n;
for(int i=1;i<=t;i++){
for(int j=L[i];j<=R[i];j++){
pos[j]=i;
}
}
for(int i=1;i<=n;i++){
if(a[i]==1)sum[pos[i]].sum1++;
else if(a[i]==2)sum[pos[i]].sum2++;
else if(a[i]==3)sum[pos[i]].sum3++;
}
for(int i=1;i<=q;i++){
int l,r;
POS ans;
ans.sum1=0,ans.sum2=0,ans.sum3=0;
//scanf("%d%d",&l,&r);
l=read();r=read();
if(pos[l]==pos[r]){
for(int j=l;j<=r;j++){
if(a[j]==1)ans.sum1++;
else if(a[j]==2)ans.sum2++;
else if(a[j]==3)ans.sum3++;
}
}
else {
for(int j=l;j<=R[pos[l]];j++){
if(a[j]==1)ans.sum1++;
else if(a[j]==2)ans.sum2++;
else if(a[j]==3)ans.sum3++;
//printf("%d ",j);
}
for(int j=pos[l]+1;j<pos[r];j++){
ans.sum1+=sum[j].sum1;
ans.sum2+=sum[j].sum2;
ans.sum3+=sum[j].sum3;
//for(int k=L[j];k<=R[j];k++){
// printf("%d ",k);
//}
}
for(int j=L[pos[r]];j<=r;j++){
if(a[j]==1)ans.sum1++;
else if(a[j]==2)ans.sum2++;
else if(a[j]==3)ans.sum3++;
//printf("%d \n",j);
}
}
printf("%d %d %d\n",ans.sum1,ans.sum2,ans.sum3);
}
return 0;
}
/*
6 3
2
1
1
3
2
1
1 6
3 3
2 4
*/