比赛 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
*/