Prime Query


Time Limit: 1 Second      Memory Limit: 196608 KB

You are given a simple task. Given a sequence A[i] with N numbers. You have to perform Q operations on the given sequence.

Here are the operations:

  • A v l, add the value v to element with index l.(1<=V<=1000)
  • R a l r, replace all the elements of sequence with index i(l<=i<= r) with a(1<=a<=10^6) .
  • Q l r, print the number of elements with index i(l<=i<=r) and A[i] is a prime number

Note that no number in sequence ever will exceed 10^7.

Input

The first line is a signer integer T which is the number of test cases.

For each test case, The first line contains two numbers N and Q (1 <= N, Q <= 100000) - the number of elements in sequence and the number of queries.

The second line contains N numbers - the elements of the sequence.

In next Q lines, each line contains an operation to be performed on the sequence.

Output

For each test case and each query,print the answer in one line.

Sample Input

1
5 10
1 2 3 4 5
A 3 1
Q 1 3
R 5 2 4
A 1 1
Q 1 1
Q 1 2
Q 1 4
A 3 5
Q 5 5
Q 1 5

Sample Output

2
1
2
4
0
4

题目大意:三种类型的操作。A操作单点更新,给某位置增加值v,R操作区间更新,整个区间都更新为值v,Q操作区间查询,查询区间内的素数个数。

解题思路:用线段树维护三个值,一个lazy标记,一个val表示点的值,一个pnum表示素数的个数。在单点查询的时候,用一个PushDown操作将lazy标记下放,同时将值下发。最后还要用PushUp操作在回溯的时候更新值。对于区间查询来说,在查询的时候将lazy下放。关键要写好PushDown和PushUp这两个操作。(今天比较坑,自己建树的时候,没有上推,QAQ)。

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
const int maxn=1e5+200;
const int maxv=1e7+200;
struct SegTree{
int val,pnum,lazy;
}segtrees[maxn*4];
int prime[maxv],pprime[maxv];
void getprime(){
int num_prime=0;
prime[0]=prime[1]=1;
for(int i=2;i<maxv;i++){
if(!prime[i])
pprime[num_prime++]=i;
for(int j=0;j<num_prime && i*pprime[j]<maxv;j++){
prime[i*pprime[j]]=1;//合数标为1,同时,prime[j]是合数i*prime[j]的最小素因子
if(!(i%pprime[j]))//即比一个合数大的质数和该合数的乘积可用一个更大的合数和比其小的质数相乘得到
break;
}
}
}
void PushUp(int rt){
segtrees[rt].pnum = segtrees[rt*2].pnum + segtrees[rt*2+1].pnum; //
}
void build(int rt,int L,int R){
segtrees[rt].val=0;
segtrees[rt].lazy=0;
segtrees[rt].pnum=0;
if(L==R){
int &v=segtrees[rt].val;
scanf("%d",&v);
if(prime[v]){
segtrees[rt].pnum=0;
}else{
segtrees[rt].pnum=1;
}
return ;
}
build(lson);
build(rson);
PushUp(rt);
} void PushDown(int rt,int L,int R){
if(segtrees[rt].lazy==1){ segtrees[rt].lazy=0;
segtrees[rt*2].lazy=1;
segtrees[rt*2+1].lazy=1; segtrees[rt*2].val=segtrees[rt].val;
segtrees[rt*2+1].val=segtrees[rt].val;
segtrees[rt].val=0;
}
}
void add(int rt,int L,int R,int pos,int _val){
if(L==R){
int &v=segtrees[rt].val;
v+=_val;
if(prime[v]){
segtrees[rt].pnum=0;
}else{
segtrees[rt].pnum=1;
}
return ;
}
PushDown(rt,L,R);
if(pos<=mid){
add(lson,pos,_val);
}else{
add(rson,pos,_val);
}
PushUp(rt);
}
void repla(int rt,int L,int R,int l_ran,int r_ran,int _val){
if(l_ran<=L&&R<=r_ran){
segtrees[rt].lazy=1;
segtrees[rt].val=_val;
int &v=segtrees[rt].val;
if(prime[v]){
segtrees[rt].pnum=0;
}else{
segtrees[rt].pnum=R-L+1;
}
return ;
}
PushDown(rt,L,R);
if(l_ran<=mid){
repla(lson,l_ran,r_ran,_val);
} if(r_ran>mid){
repla(rson,l_ran,r_ran,_val);
}
PushUp(rt);
}
int query(int rt,int L,int R,int l_ran,int r_ran){
if(l_ran<=L&&R<=r_ran){
return segtrees[rt].pnum;
}
PushDown(rt,L,R);
int ret=0;
if(l_ran<=mid){
ret+=query(lson,l_ran,r_ran);
}
if(r_ran>mid){
ret+=query(rson,l_ran,r_ran);
}
return ret;
}
int main(){
int T,n,m;
char opr[10];
getprime();
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
build(1,1,n);
int a,b,c;
for(int i=1;i<=m;i++){
scanf("%s",opr);
if(opr[0]=='A'){
scanf("%d %d",&a,&b);
add(1,1,n,b,a);
}else if(opr[0]=='R'){
scanf("%d %d %d",&a,&b,&c);
repla(1,1,n,b,c,a);
}else{
scanf("%d %d",&a,&b);
int ans=query(1,1,n,a,b);
printf("%d\n",ans);
}
}
}
return 0;
}

  

ZOJ 5638——Prime Query——————【线段树区间更新,区间查询,单点更新】的更多相关文章

  1. HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧)

    HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧) 题意分析 题目大意:一个h*w的公告牌,要在其上贴公告. 输入的是1*wi的w值,这些是公告的尺寸. 贴公告 ...

  2. 51nod1287(二分/线段树区间最值&单点更新)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 题意:中文题诶- 解法1:b[i] 存储 max(a[0 ...

  3. hdoj1754 I Hate It【线段树区间最大值维护+单点更新】

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. 【线段树区间最值单点更新模板】BNUOJ 52965 E Excellent Engineers

    http://acm.bnu.edu.cn/v3/external/gym/101512.pdf #include<bits/stdc++.h> using namespace std; ...

  5. POJ3468(线段树区间求和+区间查询)

    https://vjudge.net/contest/66989#problem/C You have N integers, A1, A2, ... , AN. You need to deal w ...

  6. 143 - ZOJ Monthly, October 2015 I Prime Query 线段树

    Prime Query Time Limit: 1 Second      Memory Limit: 196608 KB You are given a simple task. Given a s ...

  7. query 线段树 + 区间排序

    https://nanti.jisuanke.com/t/41391 这个题目没有很难想,比较暴力,但是要会算复杂度,不会算复杂度,就会觉得自己的算法会超时,实际上不会. 这个题目就是直接暴力求出每一 ...

  8. SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)

    GSS2 - Can you answer these queries II #tree Being a completist and a simplist, kid Yang Zhe cannot ...

  9. poj3667(线段树区间合并&区间查询)

    题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : ...

随机推荐

  1. linux->windows主动推送文件同步目录数据 linux-windows数据目录同步

    1 .windows下安装openssh for windows工具,下载地址 https://www.mls-software.com/opensshd.html 2.修改openssh安装目录下e ...

  2. SSM集成shiro 致使Controller无法自动注册service

    由于shiro在web.xml中配置属于过滤器,其中在web.xml中的加载顺序为: <context-param>(上下文) > listener > filter > ...

  3. CSS学习系列3--CSS3中的box-shadow的使用

    在CSS中,text-shadow是给文本添加阴影效果. box-shadow则是给元素块添加周边阴影效果. box-shadow基本的语法形式如下 box-shadow: [inset] x-off ...

  4. Gulp的学习和使用

    Gulp是一种直观.自动化构建的工具. Gulp是基于Node和NPM,安装教程点这里. 什么是Gulp? Gulp使用了node.js的流控制系统,使其(Gulp)构建更快,因为它不需要将临时文件/ ...

  5. 7.26实习培训日志-Oracle SQL(二)

    Oracle SQL(二) 条件表达式 CASE 语句 或者DECODE 函数,两者均可实现 IF-THEN-ELSE 的逻辑,相比较而言,DECODE 更加简洁 SELECT last_name , ...

  6. 【linux-command not find解决方法 】

    在linux下我们经常输入某些命令时经常出现提示说:command not find 首先 当出现 command not find时肯定是环境变量的问题,所以得修改环境变量.下面我也引用一下其他牛人 ...

  7. 浅析C#中的事件

    讲过了委托,不得不讲事件. 事件基于委托,为委托提供了一种发布/订阅机制. 在发生其他类或对象关注的事情时,类或对象可通过事件通知它们.发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为 ...

  8. CSS 框模型概述

    在 CSS 中,width 和 height 指的是内容区域的宽度和高度. 增加内边距.边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸. 假设框的每个边上有 10 个像素的外边距和 5 ...

  9. 乐字节Java8核心特性之Optional类

    大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦. Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在 ...

  10. Visual Studio 2017&C#打包应用程序详细教程,重写安装类获取安装路径

    Visual Studio搞了个Click One,在线升级是方便了,但对于俺们这苦逼的业余程序猿就... 别着急,折腾一下,还是能做出打包安装程序的.请移步CSDN看smallbabylong的文章 ...