原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4397

用线段树维护区间和即可。时间复杂度\(O((N+Q)logN)\)。

#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 100010
using namespace std; inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
} int n,q,a[maxn]; struct SegmentTree{
struct node{
int l,r,sum[4];
}t[maxn<<2];
void build(int d,int l,int r){
t[d].l=l,t[d].r=r;
if(l==r){
for(register int i=1;i<=3;i++) t[d].sum[i]=0;
t[d].sum[a[l]]=1; return;
}
int mid=(l+r)>>1;
build(d<<1,l,mid),build(d<<1|1,mid+1,r);
for(register int i=1;i<=3;i++)
t[d].sum[i]=t[d<<1].sum[i]+t[d<<1|1].sum[i];
}
void getsum(int d,const int &l,const int &r,int &ans1,int &ans2,int &ans3){
if(l<=t[d].l&&t[d].r<=r){ ans1=t[d].sum[1],ans2=t[d].sum[2],ans3=t[d].sum[3]; return; }
int mid=(t[d].l+t[d].r)>>1,sum[4]={0,0,0,0};
if(l<=mid)
getsum(d<<1,l,r,sum[1],sum[2],sum[3]),ans1=sum[1],ans2=sum[2],ans3=sum[3];
if(r>mid)
getsum(d<<1|1,l,r,sum[1],sum[2],sum[3]),ans1+=sum[1],ans2+=sum[2],ans3+=sum[3];
}
}tree; int main(){
n=read(),q=read();
for(register int i=1;i<=n;i++) a[i]=read();
tree.build(1,1,n);
for(register int i=1;i<=q;i++){
int l=read(),r=read(),ans1=0,ans2=0,ans3=0;
tree.getsum(1,l,r,ans1,ans2,ans3);
printf("%d %d %d\n",ans1,ans2,ans3);
}
return 0;
}

最新文章

  1. WPF中的Pack URI
  2. JQuery中each()的使用方法说明
  3. C语言笔记一
  4. MATLAB 秒表函数 tic toc 计算程序运行时间
  5. hdu Super Jumping
  6. Android开发之XML的创建和解析
  7. CSS Unicode 编码
  8. poj2386Lake Counting
  9. machine learn in python 第二章2.1.1
  10. WCF学习笔记之事务编程
  11. Dubbo应用文档
  12. Python自学笔记-列表生成式(来自廖雪峰的官网Python3)
  13. python 小白(无编程基础,无计算机基础)的开发之路 day2
  14. Core Graphics框架是Quartz的核心,也是内容描画的基本接口。
  15. 040、Docker managed volume(2019-03-01 周五)
  16. linux grep find查找文件夹、代码中的某行/字符串
  17. CentOS 6.7 配置 yum 安装 nginx
  18. 31网络通信之Select模型
  19. NB-IoT移远BC95使用小结
  20. initialProps被React-Navigation的navigation属性覆盖解决方案

热门文章

  1. python 类和方法(面向对象)
  2. js上 十五、数组-1
  3. Javascript 根据文件名判断是否未图片
  4. Java线程池二:线程池原理
  5. swift笔记简录
  6. winform使用Barcodex控件预览和打印一维码
  7. 160个Crackerme破解
  8. 读取xlsx文件的内容输入到xls文件中
  9. docker 安装 运行 卸载
  10. java内部类笔记