F. SUM and REPLACE

time limit per test2 seconds

memory limit per test256 megabytes

inputstandard input

outputstandard output

Let D(x) be the number of positive divisors of a positive integer x. For example, D(2) = 2 (2 is divisible by 1 and 2), D(6) = 4 (6 is divisible by 1, 2, 3 and 6).

You are given an array a of n integers. You have to process two types of queries:

REPLACE l r — for every replace ai with D(ai);

SUM l r — calculate .

Print the answer for each SUM query.

Input

The first line contains two integers n and m (1 ≤ n, m ≤ 3·105) — the number of elements in the array and the number of queries to process, respectively.

The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 106) — the elements of the array.

Then m lines follow, each containing 3 integers ti, li, ri denoting i-th query. If ti = 1, then i-th query is REPLACE li ri, otherwise it's SUM li ri (1 ≤ ti ≤ 2, 1 ≤ li ≤ ri ≤ n).

There is at least one SUM query.

Output

For each SUM query print the answer to it.

Example

inputCopy

7 6

6 4 1 10 3 2 4

2 1 7

2 4 5

1 3 5

2 4 4

1 5 7

2 1 7

outputCopy

30

13

4

22

https://codeforces.com/contest/920/problem/F

题意:

给你一个含有n个数的数组,和m个操作

操作1:将l~r中每一个数\(a[i]\)变成 \(d(a[i])\)

​ 其中$ d(x)$ 是约数个数函数。

操作2: 求l~r的a[i] 的sum和。

思路:

$ d(x)$ 约数个数函数可以利用线性筛预处理处理。

又因为 \(d(2)=2\) 和 \(d(1)=1\) 操作1对a[i]等于1或者2没有影响。

那么我们可以对一个区间中全都是1或者2不更新操作。

同时 \(d(x)\) 是收敛函数, 在1e6 的范围内,最多不超过5次改变就会收敛到1或2.

所以更新操作可以暴力解决,

同时用线段树维护即可。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
#define du3(a,b,c) scanf("%d %d %d",&(a),&(b),&(c))
#define du2(a,b) scanf("%d %d",&(a),&(b))
#define du1(a) scanf("%d",&(a));
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {a %= MOD; if (a == 0ll) {return 0ll;} ll ans = 1; while (b) {if (b & 1) {ans = ans * a % MOD;} a = a * a % MOD; b >>= 1;} return ans;}
void Pv(const vector<int> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%d", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("\n");}}}
void Pvl(const vector<ll> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%lld", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("\n");}}} inline void getInt(int *p);
const int maxn = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
// d(n)表示n的约数个数和
// prime[i]表示第i个质数
//num[i]表示i的最小质因子出现次数
int sshu[maxn];
int N = maxn;
int num[maxn];
int d[maxn];
bool no[maxn];
int tot;
void prepare()
{
d[1] = 1; num[1] = 1;
for (int i = 2; i < N; i++) {
if (!no[i]) {
sshu[++tot] = i;
d[i] = 2; num[i] = 1;
}
for (int j = 1; j <= tot && sshu[j]*i < N; j++) {
int v = sshu[j] * i;
no[v] = 1;
if (i % sshu[j] == 0) {
num[v] = num[i] + 1;
d[v] = d[i] / num[v] * (num[v] + 1);
break;
}
d[v] = d[i] << 1; num[v] = 1;
}
}
//for (int i=1;i<=10;i++) printf("%d\n",d[i]);
}
int a[maxn];
struct node {
int l, r;
int laze;
bool isall;
ll num;
} segment_tree[maxn << 2]; void pushup(int rt)
{
segment_tree[rt].num = segment_tree[rt << 1].num + segment_tree[rt << 1 | 1].num;
segment_tree[rt].isall = segment_tree[rt << 1].isall & segment_tree[rt << 1 | 1].isall;
}
void build(int rt, int l, int r)
{
segment_tree[rt].l = l;
segment_tree[rt].r = r;
if (l == r) {
segment_tree[rt].num =a[l];
if (segment_tree[rt].num == 1 || segment_tree[rt].num == 2) {
segment_tree[rt].isall = 1;
}
return ;
}
int mid = (l + r) >> 1;
build(rt << 1, l, mid);
build(rt << 1 | 1, mid + 1, r);
pushup(rt);
} void update(int rt, int l, int r)
{
if (l <= segment_tree[rt].l && r >= segment_tree[rt].r && segment_tree[rt].isall) {
return;
}
if (segment_tree[rt].l == segment_tree[rt].r) {
segment_tree[rt].num = d[segment_tree[rt].num];
if (segment_tree[rt].num == 1 || segment_tree[rt].num == 2) {
segment_tree[rt].isall = 1;
}
return ;
} else {
int mid = (segment_tree[rt].l + segment_tree[rt].r) >> 1;
if (mid >= l) {
update(rt << 1, l, r);
}
if (mid < r) {
update(rt << 1 | 1, l, r);
}
pushup(rt);
}
}
ll query(int rt, int l, int r)
{
if (segment_tree[rt].l >= l && segment_tree[rt].r <= r) {
ll res = 0ll;
res += segment_tree[rt].num;
return res;
}
int mid = (segment_tree[rt].l + segment_tree[rt].r) >> 1;
ll res = 0ll;
if (mid >= l) {
res += query(rt << 1, l, r);
}
if (mid < r) {
res += query(rt << 1 | 1, l, r);
}
return res; }
int main()
{
//freopen("D:\\code\\text\\input.txt","r",stdin);
//freopen("D:\\code\\text\\output.txt","w",stdout);
prepare();
int n, m;
du2(n, m);
repd(i, 1, n) {
du1(a[i]);
}
build(1, 1, n);
repd(i, 1, m) {
int op; int l, r;
du3(op, l, r);
if (op == 1) {
update(1, l, r);
} else {
printf("%lld\n", query(1, l, r));
}
}
return 0;
} inline void getInt(int *p)
{
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
} else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}  

Educational Codeforces Round 37-F.SUM and REPLACE (线段树,线性筛,收敛函数)的更多相关文章

  1. 【Educational Codeforces Round 37】F. SUM and REPLACE 线段树+线性筛

    题意 给定序列$a_n$,每次将$[L,R]$区间内的数$a_i$替换为$d(a_i)$,或者询问区间和 这题和区间开方有相同的操作 对于$a_i \in (1,10^6)$,$10$次$d(a_i) ...

  2. Educational Codeforces Round 23 F. MEX Queries 离散化+线段树

    F. MEX Queries time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  3. 【Educational Codeforces Round 37 F】SUM and REPLACE

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 那个D函数它的下降速度是很快的. 也就是说到最后他会很快的变成2或者1 而D(2)==2,D(1)=1 也就是说,几次操作过后很多数 ...

  4. Educational Codeforces Round 64 (Rated for Div. 2) (线段树二分)

    题目:http://codeforces.com/contest/1156/problem/E 题意:给你1-n  n个数,然后求有多少个区间[l,r] 满足    a[l]+a[r]=max([l, ...

  5. Educational Codeforces Round 37

    Educational Codeforces Round 37 这场有点炸,题目比较水,但只做了3题QAQ.还是实力不够啊! 写下题解算了--(写的比较粗糙,细节或者bug可以私聊2333) A. W ...

  6. Educational Codeforces Round 37 (Rated for Div. 2)C. Swap Adjacent Elements (思维,前缀和)

    Educational Codeforces Round 37 (Rated for Div. 2)C. Swap Adjacent Elements time limit per test 1 se ...

  7. Educational Codeforces Round 40 F. Runner's Problem

    Educational Codeforces Round 40 F. Runner's Problem 题意: 给一个$ 3 * m \(的矩阵,问从\)(2,1)$ 出发 走到 \((2,m)\) ...

  8. Educational Codeforces Round 37 A B C D E F

    A. water the garden Code #include <bits/stdc++.h> #define maxn 210 using namespace std; typede ...

  9. codeforces 920 EFG 题解合集 ( Educational Codeforces Round 37 )

    E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  10. [Codeforces]Educational Codeforces Round 37 (Rated for Div. 2)

    Water The Garden #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h ...

随机推荐

  1. github pages + hexo 搭建 blog 遇到的问题

    一. ERROR Deployer not found: git $ hexo d ERROR Deployer not found: git npm install --save hexo-depl ...

  2. 计算1+2+...+n

    牛客上面一道题,闲来无事做做陶冶情操. 这一陶冶还真的陶冶出了骚操作 看一下题目吧: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及 ...

  3. bootstrap基础学习【表单含按钮】(二)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. Reactor系列(五)map映射

    #java# #reactor# #flux# #map# #映射# 视频解视: https://www.bilibili.com/video/av79179444/ FluxMonoTestCase ...

  5. Hanlp-地名识别调试方法详解

    HanLP收词特别是实体比较多,因此特别容易造成误识别.下边举几个地名误识别的例子,需要指出的是,后边的机构名识别也以地名识别为基础,因此,如果地名识别不准确,也会导致机构名识别不准确. 类型1 数字 ...

  6. vue中可以自定义动画的前缀

    vue中可以自定义动画的前缀1.只需在中加入name属性即可 <transition name="my"> <h6 v-if="flag2"& ...

  7. java动态更新枚举类

    工作中遇到需要对枚举类的值进行动态更新 手动改不现实也不方便 现记录下来方便以后学习使用 1.在工程utils包中添加动态更新枚举类得工具类(根据自己得项目,放到指定位置调用就可以) 2.一开始陷入了 ...

  8. LINUX添加新的用户账号并赋予root权限

    一:添加新的用户账号使用 useradd 命令 语法:     useradd  选项  用户名 示例:      # 添加用户,设定登录目录:useradd -d  /home/admin -m a ...

  9. Centos安装elasticsearch,php连接使用

    一.下载安装JAVA 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  10. 欢迎使用f MWeb

    MWeb 是专业的 Markdown 写作.记笔记.静态博客生成软件,目前已支持 Mac,iPad 和 iPhone.MWeb 有以下特色: 软件本身: 使用原生的 macOS 技术打造,追求与系统的 ...