// HDU5634 Rikka with Phi 线段树
// 思路:操作1的时候,判断一下当前区间是不是每个数都相等,在每个数相等的区间上操作。相当于lazy,不必更新到底。 #include <bits/stdc++.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int N = ;
const int MOD = 1e9+;
#define LL long long
double const pi = acos(-);
void fre() {
freopen("in.txt","r",stdin);
}
// inline int r() {
// int x=0,f=1;char ch=getchar();
// while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
// while(ch>='0'&&ch<='9') { x=x*10+ch-'0';ch=getchar();}return x*f;
// }
const int MAXM=1e7+;
LL euler[];
int a[N];
void Geteuler()
{
memset(euler, , sizeof(euler));
euler[] = ;
for(LL i = ; i < MAXM; i++) if(!euler[i])
for(LL j = i; j < MAXM; j += i){
if(!euler[j]) euler[j] = j;
euler[j] = euler[j] / i * (i-);
}
} struct tree{
int l,r;
LL sum,lazy;
}t[N<<]; void pushup(int rt){
t[rt].sum=t[rt<<].sum+t[rt<<|].sum;
if(t[rt<<].lazy==t[rt<<|].lazy) t[rt].lazy=t[rt<<].lazy;
else t[rt].lazy=;
} void pushdown(int rt){
if(t[rt].lazy){
t[rt<<].lazy=t[rt<<|].lazy=t[rt].lazy;
t[rt<<].sum=(t[rt<<].r-t[rt<<].l+)*t[rt<<].lazy;
t[rt<<|].sum=(t[rt<<|].r-t[rt<<|].l+)*t[rt<<|].lazy;
t[rt].lazy=;
}
}
void build(int rt,int x,int y){
t[rt].l=x;
t[rt].r=y;
if(x==y){
t[rt].sum=a[x];
t[rt].lazy=a[x];
return;
}
int mid=(x+y)>>;
build(rt<<,x,mid);
build(rt<<|,mid+,y);
pushup(rt);
} void update1(int rt,int x,int y){
if(t[rt].lazy&&t[rt].l==x&&t[rt].r==y){
t[rt].sum=(t[rt].r-t[rt].l+)*euler[t[rt].lazy];
t[rt].lazy=euler[t[rt].lazy];
return;
}
pushdown(rt);
int mid=(t[rt].l+t[rt].r)>>;
if(y<=mid) update1(rt<<,x,y);
else if(x>mid) update1(rt<<|,x,y);
else {
update1(rt<<,x,mid);
update1(rt<<|,mid+,y);
}
pushup(rt);
} void update2(int rt,int x,int y,int z){
if(t[rt].l==x&&t[rt].r==y){
t[rt].lazy=z;
t[rt].sum=1LL*z*(t[rt].r-t[rt].l+);
return;
}
pushdown(rt);
int mid=(t[rt].l+t[rt].r)>>;
if(y<=mid) update2(rt<<,x,y,z);
else if(x>mid) update2(rt<<|,x,y,z);
else {
update2(rt<<,x,mid,z);
update2(rt<<|,mid+,y,z);
}
pushup(rt);
} LL query(int rt,int x,int y){
if(t[rt].l==x&&t[rt].r==y){
return t[rt].sum;
}
pushdown(rt);
int mid=(t[rt].l+t[rt].r)>>;
if(y<=mid) return query(rt<<,x,y);
else if(x>mid) return query(rt<<|,x,y);
else{
return query(rt<<,x,mid)+query(rt<<|,mid+,y);
}
}
int main(){
// fre();
Geteuler();
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
build(,,n);
while(m--){
int op,x,y,z;
scanf("%d%d%d",&op,&x,&y);
if(op==) update1(,x,y);
else if(op==) {
scanf("%d",&z);
update2(,x,y,z);
}
else {
// cout<<"sdf"<<endl;
LL ans=query(,x,y);
printf("%I64d\n",ans);
}
}
}
return ;
}

HDU5634 Rikka with Phi 线段树的更多相关文章

  1. HDU 5634 Rikka with Phi 线段树

    题意:bc round 73 div1 D 中文题面 分析:注意到10^7之内的数最多phi O(log(n))次就会变成1, 因此可以考虑把一段相同的不为1的数缩成一个点,用平衡树来维护. 每次求p ...

  2. Rikka with Phi 线段树

    Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...

  3. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  4. hdu 5828 Rikka with Sequence 线段树

    Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...

  5. HDU 6089 Rikka with Terrorist (线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6089 题解 这波强行维护搞得我很懵逼... 扫描线,只考虑每个点能走到左上方(不包括正上方,但包括正左 ...

  6. Rikka with Mista 线段树求交点个数

    由于上下线段是不可能有交点的 可以先看左右线段树,按照y递增的顺序,对点进行排序. 升序构造,那么对于从某一点往下的射线,对于L,R进行区间覆盖,线段交点个数就是单点的被覆盖的次数. 降序构造,那么对 ...

  7. HDU5828 Rikka with Sequence 线段树

    分析:这个题和bc round 73应该是差不多的题,当时是zimpha巨出的,那个是取phi,这个是开根 吐槽:赛场上写的时候直接维护数值相同的区间,然后1A,结果赛后糖教一组数据给hack了,仰慕 ...

  8. HDU 5828 Rikka with Sequence(线段树区间加开根求和)

    Problem DescriptionAs we know, Rikka is poor at math. Yuta is worrying about this situation, so he g ...

  9. 牛客多校第十场 A Rikka with Lowbit 线段树

    链接:https://www.nowcoder.com/acm/contest/148/A来源:牛客网 题目描述 Today, Rikka is going to learn how to use B ...

随机推荐

  1. Linux中断处理体系结构分析

    Linux中断处理体系结构分析(一) 异常,就是可以打断CPU正常运行流程的一些事情,比如外部中断.未定义指令.试图修改只读的数据.执行swi指令(Software Interrupt Instruc ...

  2. TCL语言笔记:TCL中的列表操作

    一.介绍 列表则是具有特殊解释的字符串.Tcl 中的列表操作和其它 Tcl 命令一样具有相同的结构.列表可应用在诸如 foreach 这样的以列表为变元的循环命令中,也应于构建 eval 命令的延迟命 ...

  3. HTML5 编辑 API 之 Range 对象(二)

    1.Range.cloneContents()The Range.cloneContents() returns a DocumentFragment copying the objects of t ...

  4. 59. Spiral Matrix II

    题目: Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. ...

  5. UPC 2224 / “浪潮杯”山东省第四届ACM大学生程序设计竞赛 1008 Boring Counting 主席树

    Problem H:Boring Counting Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 65535/32768K (Java/ ...

  6. Android使用Fragment程序崩溃

    调用Fragment的Activity要继承并实现Fragment.OnFragmentInteractionListener

  7. SGU 441 Set Division(矩阵快速幂)

    题目链接:http://acm.sgu.ru/status.php 题意:将n个有区别的球放到m个无区别的盒子里,盒子不能为空.不同的方案数. 思路:设f[i][j]表示将前i个球放到j个盒子里,那么 ...

  8. [58 Argo]让argo跑起来

    接上一章,使用命令mvn jetty:run启动Argo,进入localhost的页面: 58在这里给了几种常见的访问和传值方法的示例,当点击到第三条<区分queryString和form参数& ...

  9. 关于BigDecimal的四舍五入和截断 (2007-08-10 15:06:26)

    关于四舍五入:ROUND_HALF_UP: 遇到.5的情况时往上近似,例: 1.5 ->;2ROUND_HALF_DOWN : 遇到.5的情况时往下近似,例: 1.5 ->;1 BigDe ...

  10. java---面试题---.java"源文件中可以包括多个类(不是内部类)

    答题时,先答是什么,再答有什么作用和要注意什么 一个".java"源文件中可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致,main方法只能写在 ...