#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define INF 0X3f3f3f3f
const ll MAXN = 2e5 + ;
const ll MOD = 1e9 + ;
ll a[MAXN];
struct node
{
int left, right; //区间端点
ll max, sum; //看题目要求
ll lazy;
void update(ll x)
{
sum += (right - left + ) * x;
lazy += x;
}
} tree[MAXN << ];
//建树,开四倍
void push_up(int x)
{
tree[x].sum = tree[x << ].sum + tree[x << | ].sum;
tree[x].max = max(tree[x << ].max, tree[x << | ].max);
}
void push_down(int x)
{
ll lazeval = tree[x].lazy;
if (lazeval)
{
tree[x << ].update(lazeval);
tree[x << | ].update(lazeval);
tree[x].lazy = ;
}
}
//若原数组从a[1]~a[n],调用build(1,1,n);
void build(int x, int l, int r)
{
tree[x].left = l;
tree[x].right = r;
tree[x].sum = tree[x].lazy = ;
if (l == r) //若到达叶节点
{
tree[x].sum = a[l]; //存储A数组的值
tree[x].max = a[l];
}
else
{
int mid = (l + r) / ;
build(x << , l, mid);
build(x << | , mid + , r);
push_up(x);
}
return;
}
//update(1,l,r,v)
void update(int x, int l, int r, ll v) //区间更新
{
int L = tree[x].left, R = tree[x].right;
if (l <= L && R <= r)
{
tree[x].update(v);
tree[x].max += v;
}
else
{
push_down(x);
int mid = (L + R) / ;
if (mid >= l)
update(x << , l, r, v);
if (r > mid)
update(x << | , l, r, v);
push_up(x);
}
}
//单点更新,更新pos点,调用add(1,pos,v)
void add(int x, int pos, ll v) //当前更新的节点的编号为id(一般是以1为第一个编号)。pos为需要更新的点的位置,v为修改的值的大小
{ int L = tree[x].left, R = tree[x].right;
if (L == pos && R == pos) //左右端点均和pos相等,说明找到了pos所在的叶子节点
{
tree[x].sum += v;
tree[x].max += v;
return; //找到了叶子节点就不需要在向下寻找了
}
int mid = (L + R) / ;
if (pos <= mid)
add(x << , pos, v);
else
add(x << | , pos, v); //寻找k所在的子区间
push_up(x); //向上更新
}
//调用query_sum(1,l,r)即可查询[l,r]区间内元素的总和
//区间查询
ll query_sum(int x, int l, int r)
{
int L = tree[x].left, R = tree[x].right;
if (l <= L && R <= r)
return tree[x].sum;
else
{
push_down(x);
ll ans = ;
int mid = (L + R) / ;
if (mid >= l)
ans += query_sum(x << , l, r);
if (r > mid)
ans += query_sum(x << | , l, r);
push_up(x);
return ans;
}
}
//调用query_max(1,l,r)即可求[l,r]区间内元素的最大值
ll query_max(int x, int l, int r)
{
int L = tree[x].left, R = tree[x].right;
if (l == L && R == r)
return tree[x].max;
else
{
push_down(x);
int mid = (L + R) / ;
if (r <= mid)
return query_max(x << , l, r);
else if (l > mid)
return query_max(x << | , l, r);
else
return max(query_max(x << , l, mid), query_max(x << | , mid+, r));
}
}
int main()
{
ll n, m;
while (scanf("%lld%lld", &n, &m) != EOF)
{
for (int i = ; i <= n; i++)
scanf("%lld", &a[i]);
build(, , n);
getchar();
while (m--)
{
int l, r;
char que;
scanf("%c %d %d", &que, &l, &r);
getchar();
if (que == 'Q')
printf("%lld\n", query_max(, l, r));
else if (que == 'U')
update(, l,l, r - a[l]),a[l]=r;
}
}
return ;
}

线段树+Lazy标记(我的模版)的更多相关文章

  1. poj3468 线段树+lazy标记

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 92921   ...

  2. POJ3237 Tree(树剖+线段树+lazy标记)

    You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbe ...

  3. 线段树+lazy标记 2019年8月10日计蒜客联盟周赛 C.小A的题

    题目链接:https://nanti.jisuanke.com/t/40852 题意:给定一个01串s,进行m次操作,|s|<=1e6,m<=5e5 操作有两种 l r 0,区间[l,r] ...

  4. HDU_1698 Just a Hook(线段树+lazy标记)

    pid=1698">题目请点我 题解: 接触到的第一到区间更新,须要用到lazy标记.典型的区间着色问题. lazy标记详情请參考博客:http://ju.outofmemory.cn ...

  5. POJ 3225 线段树+lazy标记

    lazy写崩了--. 查了好久 /* U-> [l,r]–>1 I-> [1,l-1] [r+1,+无穷] –>0 D-> [l,r]–>0 C-> [1,l ...

  6. C++-POJ2777-Count Color[线段树][lazy标记][区间修改]

     分析:https://www.bilibili.com/read/cv4777102 #include <cstdio> #include <algorithm> using ...

  7. 线段树lazy标记??Hdu4902

    Nice boat Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) To ...

  8. hdu-3397 Sequence operation 线段树多种标记

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3397 题目大意: 0 a b表示a-b区间置为0 1 a b表示a-b区间置为1 2 a b表示a- ...

  9. HDU 3468:A Simple Problem with Integers(线段树+延迟标记)

    A Simple Problem with Integers Case Time Limit: 2000MS Description You have N integers, A1, A2, ... ...

随机推荐

  1. win7+oracle11,vmbox中winxp连接

    重启TNSLSNR  打开CMD,输入以下命令. lsnrctl stop lsnrctl start lsnrctl stat /////////////////////////////////// ...

  2. Linux使用expect和rsync实现密码自动输入无人值守自动同步备份

    我们常用sudo,ssh.ftp命令操作服务器或者修改权限的时候都会要求输入password,但是shell脚本运行中该如何交互实现自动输入密码呢? 下面总结三种实现方法. 一.重定向:用重定向方法实 ...

  3. IE框架表单遍历

    // HtmlWeb.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <atlbase.h> #include ...

  4. 1035 插入与归并 (25 分)C语言

    根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...

  5. 08_jquery里面的$(this)和this都什么时候用,有什么区别

    当你用的是jquery时,就用$(this),如果是JS,就用this $(this).html( $(this).html() + " BAM! "); 这个里的html()是J ...

  6. MySQL之插入数据(添加数据)-INSERT

    基本语法: INSERT 语句有两种语法形式,分别是 INSERT…VALUES 语句和 INSERT…SET 语句. 1.INSERT...VLAUES语句 INSERT VLAUES的语法格式如下 ...

  7. 【python小随笔】python 解析xml数据的新手大坑>>抓取多重标签,遍历各标签的数据

    xml文档: <GetMatchingProductResult ASIN="B071LF9R6G" status="Success">...< ...

  8. 【转】8 个效果惊人的 WebGL/JavaScript 演示

    英文原文:9 IMPRESSIVE WEBGL JAVASCRIPT EFFECT SHOWCASE,翻译:iteye WebGL 是一种 3D 绘图标准,这种绘图技术标准允许把 JavaScript ...

  9. ArcEngine DEM叠加影像

    代码执行前: 代码执行后: 影像叠加代码: /// <summary> /// 叠加DEM /// </summary> /// <param name="pR ...

  10. AspectJ——预编译方式实现AOP