http://codevs.cn/problem/4927/

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string> using namespace std;
const int N = 1e5 + ; #define oo 1423333339
#define LL long long
#define gg 465432477 struct Node {
LL l, r, w, f, mx, mi, fg;
bool qs;
} T[N << ];
LL n, m, answer, maxn, minn; inline LL read() {
LL x = , f = ;
char c = getchar();
while(c < '' || c > '') { if(c == '-')f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
} void imp(LL jd) {
T[jd].w = T[jd << ].w + T[jd << | ].w;
T[jd].mx = max(T[jd << ].mx, T[jd << | ].mx);
T[jd].mi = min(T[jd << ].mi, T[jd << | ].mi);
} void down(LL jd) {
if(T[jd].qs) {
T[jd << ].f = ;
T[jd << ].qs = ;
T[jd << ].fg = T[jd].fg;
T[jd << ].w = (T[jd << ].r - T[jd << ].l + ) * T[jd].fg; T[jd << | ].f = ;
T[jd << | ].qs = ;
T[jd << | ].fg = T[jd].fg;
T[jd << | ].w = (T[jd << | ].r - T[jd << | ].l + ) * T[jd].fg; T[jd << ].mi = T[jd << ].mx = T[jd << | ].mi= T[jd << | ].mx=T[jd].fg; T[jd].fg = ;
T[jd].qs = ;
}
if(T[jd].f) {
T[jd << ].f += T[jd].f;
T[jd << ].w += (T[jd << ].r - T[jd << ].l + ) * T[jd].f;
T[jd << ].mi += T[jd].f;
T[jd << ].mx += T[jd].f; T[jd << | ].f += T[jd].f;
T[jd << | ].w += (T[jd << | ].r - T[jd << | ].l + ) * T[jd].f;
T[jd << | ].mi += T[jd].f;
T[jd << | ].mx += T[jd].f; T[jd].f = ;
}
return ;
} void build_tree(LL l, LL r, LL jd) {
T[jd].l = l;
T[jd].r = r;
if(l == r) {
T[jd].w = read();
T[jd].mx = T[jd].w;
T[jd].mi = T[jd].w;
return ;
}
LL mid = (l + r) >> ;
build_tree(l, mid, jd << );
build_tree(mid + , r, jd << | );
imp(jd);
} void Sec_g(LL l, LL r, LL jd, LL x, LL y, LL yj) {
if(x <= l && r <= y) {
T[jd].f += yj;
T[jd].w += (T[jd].r - T[jd].l + ) * yj;
T[jd].mi += yj;
T[jd].mx += yj;
return ;
}
if(T[jd].f || T[jd].qs)
down(jd);
LL mid = (l + r) >> ;
if(x <= mid)
Sec_g(l, mid, jd << , x, y, yj);
if(y > mid)
Sec_g(mid + , r, jd << | , x, y, yj);
imp(jd);
} void Sec_set(LL l, LL r, LL jd, LL x, LL y, LL k) {
if(x <= l && r <= y) {
T[jd].fg = k;
T[jd].qs = ;
T[jd].w = (T[jd].r - T[jd].l + ) * T[jd].fg;
T[jd].mx = k;
T[jd].mi = k;
T[jd].f = ;
return ;
}
LL mid = (l + r ) >> ;
if(T[jd].f || T[jd].qs)
down(jd);
if(x <= mid)
Sec_set(l, mid, jd << , x, y, k);
if(y > mid)
Sec_set(mid + , r, jd << | , x, y, k);
imp(jd);
} void Sec_calc(LL l, LL r, LL jd, LL x, LL y) {
if(x <= l && r <= y) {
answer += T[jd].w;
return;
}
if(T[jd].f || T[jd].qs)
down(jd);
LL mid = (l + r) >> ;
if(x <= mid)
Sec_calc(l, mid, jd << , x, y);
if(y > mid)
Sec_calc(mid + , r, jd << | , x, y);
} void Sec_min(LL l, LL r, LL jd, LL x, LL y) {
if(x <= l && r <= y) {
minn = min(minn, T[jd].mi);
return ;
}
if(T[jd].f || T[jd].qs)
down(jd);
LL mid = (l + r) >> ;
if(x <= mid)
Sec_min(l, mid, jd << , x, y);
if(y > mid)
Sec_min(mid + , r, jd << | , x, y);
} void Sec_max(LL l, LL r, LL jd, LL x, LL y) {
if(x <= l && r <= y) {
maxn = max(maxn, T[jd].mx);
return ;
}
if(T[jd].f || T[jd].qs)
down(jd);
LL mid = (l + r) >> ;
if(x <= mid)
Sec_max(l, mid, jd << , x, y);
if(y > mid)
Sec_max(mid + , r, jd << | , x, y);
} int main() {
freopen("gg.in", "r", stdin);
n = read();
m = read();
build_tree(, n, );
for(LL i = ; i <= m; i ++) {
string s;
cin >> s;
LL x = read();
LL y = read();
if(s == "add") {
LL k = read();
Sec_g(, n, , x, y, k);
continue;
}
if(s == "set") {
LL k = read();
Sec_set(, n, , x, y, k);
continue;
}
if(s == "sum") {
answer = ;
Sec_calc(, n, , x, y);
printf("%lld\n", answer);
continue;
}
if(s == "min") {
minn = oo;
Sec_min(, n, , x, y);
printf("%lld\n", minn);
continue;
}
if(s == "max") {
maxn = -oo;
Sec_max(, n, , x, y);
printf("%lld\n", maxn);
continue;
}
}
return ;
}
/*
10 6
3 9 2 8 1 7 5 0 4 6
add 4 9 4
set 2 6 2
sum 2 10
max 1 7
min 3 6
*/

[codevs]线段树练习5的更多相关文章

  1. codevs 线段树练习ⅠⅡⅢ

    1080 线段树练习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 一行N个方格,开始每个格子里都有 ...

  2. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  3. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  4. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  5. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  6. codevs 1080 线段树练习

    链接:http://codevs.cn/problem/1080/ 先用树状数组水一发,再用线段树水一发 树状数组代码:84ms #include<cstdio> #include< ...

  7. 线段树练习 codevs 1080

    /* codevs 1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 一行N个方格,开 ...

  8. codevs 1080 线段树练习 CDQ分治

    codevs 1080 线段树练习 http://codevs.cn/problem/1080/  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 一行N个 ...

  9. 4163 hzwer与逆序对 (codevs + 权值线段树 + 求逆序对)

    题目链接:http://codevs.cn/problem/4163/ 题目:

随机推荐

  1. C++ new/delete详解及原理

    学了冯诺依曼体系结构,我们知道: 硬件决定软件行为,数据都是围绕内存流动的. 可想而知,内存是多么重要.当然,我们这里说的内存是虚拟内存(详情看Linxu壹之型). 1.C/C++内存布局 2.C语言 ...

  2. H5中表格的用法

    1.表格的基本结构: 表格由行和列组成,单元格式表格的最基本单元;每个表格均有若干行,行标签由<tr></tr>定义,每行被分割为若干单元格,由<td></t ...

  3. fatfs系统的移植

    integer.h   FATFS的数据类型定义(一般不需要更改,其他的文件都需要引用这个文件的内容) ffcon.h FATFS的配置文件,配置项的各个参数都需要在这里修改 一个细致的讲解fatfs ...

  4. oracle update left join 写法

    oracle update left join 写法 (修改某列,条件字段在关联表中) 案例: E:考核表 X,:用户表 USERNAME 关联 需求:修改营业部最高分 分析:通过登录账号的营业部OR ...

  5. 在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)

    原文:在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  6. SQL 多并发 多人取号,防止重复取号SQL 办法

    BEGIN TRAN         SELECT  *  from 表明 WITH(HOLDLOCK)        UPDATE 表名 SET 值=1 WHERE 字段=@carrierNo;   ...

  7. 淘宝图片指纹匹配功能c#实现

    #region 生成图片及图片比较 public String GetHash(Image SourceImg) { Image image = ReduceSize(SourceImg); Byte ...

  8. (面试题)请用C语言实现在32位环境下,两个无符号长整数相加的函数,相加之和不能存储在64位变量中

    分析:长整数相加,将结果分为高位和低位部分,分别保存在两个32整数中. 比如:unsigned int a = 0xFFFFFFFF, unsigned int b = 0x1, 结果用unsigne ...

  9. 笔记 - C#从头开始构建编译器 - 2

    视频与PR:https://github.com/terrajobst/minsk/blob/master/docs/episode-02.md 作者是 Immo Landwerth(https:// ...

  10. C++报错:error C3874

    解决: 1.class 定义之后不要忘记分号 2.主函数写为int main() { }