给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:

1、“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=lrA[i]}。

2、“2 x y”,把 A[x] 改成 y。

对于每个查询指令,输出一个整数表示答案。

输入格式

第一行两个整数N,M。

第二行N个整数A[i]。

接下来M行每行3个整数k,x,y,k=1表示查询(此时如果x>y,请交换x,y),k=2表示修改。

输出格式

对于每个查询指令输出一个整数表示答案。

每个答案占一行。

数据范围

N≤500000,M≤100000N≤500000,M≤100000

输入样例:

5 3
1 2 -3 4 5
1 2 3
2 2 -1
1 3 2

输出样例:

2
-1
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath> const int maxn=5e5+;
typedef long long ll;
using namespace std;
struct node
{
int l,r;
ll sum,suml,sumr,summax;
}tree[maxn<<];
void pushup(int m)
{
tree[m].sum=(tree[m<<].sum+tree[m<<|].sum);
tree[m].summax=max(max(tree[m<<].summax,tree[m<<|].summax),tree[m<<].sumr+tree[m<<|].suml);
tree[m].suml=max(tree[m<<].suml,tree[m<<].sum+tree[m<<|].suml);
tree[m].sumr=max(tree[m<<|].sumr,tree[m<<].sumr+tree[m<<|].sum);
}
void build(int m,int l,int r)
{
tree[m].l=l;
tree[m].r=r;
if(l==r)
{
scanf("%lld",&tree[m].sum);
tree[m].summax=tree[m].sum;
tree[m].suml=tree[m].sum;
tree[m].sumr=tree[m].sum;
return ;
}
int mid=(l+r)>>;
build(m<<,l,mid);
build(m<<|,mid+,r);
pushup(m);
}
void update(int m,int pos,ll val)
{
if(tree[m].l==tree[m].r&&tree[m].l==pos)
{
tree[m].sum=val;
tree[m].summax=tree[m].sum;
tree[m].suml=tree[m].sum;
tree[m].sumr=tree[m].sum;
return ;
}
int mid=(tree[m].l+tree[m].r)>>;
if(pos<=mid)
{
update(m<<,pos,val);
}
else
{
update(m<<|,pos,val);
}
pushup(m);
}
node query(int m,int l,int r)
{
if(tree[m].l==l&&tree[m].r==r)
{
return tree[m];
}
int mid=(tree[m].l+tree[m].r)>>;
if(r<=mid)
{
return query(m<<,l,r);
}
else if(l>mid)
{
return query(m<<|,l,r);
}
else
{
node treel,treer,temp;
treel=query(m<<,l,mid);
treer=query(m<<|,mid+,r);
temp.sum=treel.sum+treer.sum;
temp.summax=max(max(treel.summax,treer.summax),treel.sumr+treer.suml);
temp.suml=max(treel.suml,treel.sum+treer.suml);
temp.sumr=max(treer.sumr,treer.sum+treel.sumr);
return temp;
}
}
int main()
{ int n,q;
cin>>n>>q;
build(,,n);
int op,l,r;
while(q--)
{
scanf("%d",&op);
if(op==)
{
scanf("%d%d",&l,&r);
if(l>r)
{
swap(l,r);
}
printf("%lld\n",query(,l,r).summax);
}
else
{
scanf("%d%d",&l,&r); update(,l,r);
}
}
return ;
}

ACwing 你能回答这些问题吗(线段树求最大连续字段和)的更多相关文章

  1. 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

    原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...

  2. UVA 11983 Weird Advertisement --线段树求矩形问题

    题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...

  3. BNU 2418 Ultra-QuickSort (线段树求逆序对)

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n & ...

  4. hdu 1394 (线段树求逆序数)

    <题目链接> 题意描述: 给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序数,找 ...

  5. xdoj-1324 (区间离散化-线段树求区间最值)

    思想 : 1 优化:题意是覆盖点,将区间看成 (l,r)转化为( l-1,r) 覆盖区间 2 核心:dp[i]  覆盖从1到i区间的最小花费 dp[a[i].r]=min (dp[k])+a[i]s; ...

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

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

  7. poj2299 Ultra-QuickSort(线段树求逆序对)

    Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...

  8. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  9. HDU_1394_Minimum Inversion Number_线段树求逆序数

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

随机推荐

  1. sql developer连接mysql数据库

    1 首先打开sql developer ,选择上方菜单,工具(tools)--->首选项,如下图 2  数据库(database)--->第三方 JDBC驱动程序 ; “添加条目”,选择m ...

  2. 【可视化-2】将图像当作DSM进行三维显示

    上一篇文章中,已经跳出颜色或者亮度的局限,将图像视作一般化的栅格数据,并提供了四种利用颜色和亮度来直观表示栅格间取值差异的可视化方法. 栅格数据的四种可视化方式 这一回,我们又要从一般化走向特殊化.栅 ...

  3. 用 Python 写个消消乐小游戏

    提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 很多人学习python,不 ...

  4. 谁来教我渗透测试——黑客必须掌握的HTML基础(二)

    今天我们继续看看html的学习笔记. 文本标签 标题标签<hn> 将文本设置为标题显示的标签对.设定标题字体大小,n=1(大)~6(小),标题大小一共有6种,也就是从<h1>… ...

  5. Vue 修饰符sync的应用

    官方链接 https://cn.vuejs.org/v2/guide/components-custom-events.html#sync-修饰符 这个解释有点不太直观,用代码解释一下 父组件 v-b ...

  6. 【BJOI2018】求和 - 倍增LCA

    题目描述 $master$ 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的$k$次方和,而且每次的$k$可能是不同的.此处节点深度的定义是这个节点到根的路 ...

  7. 手把手教你在win10下搭建pytorch GPU环境(Anaconda+Pycharm)

    Anaconda指的是一个开源的Python发行版本,其主要优点如下: Anaconda默认安装了常见的科学计算包,用它搭建起Python环境后不用再费时费力安装这些包: Anaconda可以创建互相 ...

  8. 机器学习:支持向量机(SVM)

    SVM,称为支持向量机,曾经一度是应用最广泛的模型,它有很好的数学基础和理论基础,但是它的数学基础却比以前讲过的那些学习模型复杂很多,我一直认为它是最难推导,比神经网络的BP算法还要难懂,要想完全懂这 ...

  9. IntelliJ IDEA安装Activiti插件并使用

    一.安装Activiti插件 1.搜索插件 点击菜单[File]-->[Settings...]打开[Settings]窗口. 点击左侧[Plugins]按钮,在右侧输出"actiBPM",点击 ...

  10. python基础 Day12

    python Day12 生成器python社区,生成器与迭代器看成一种.生成器的本质就是迭代器. 区别:生成器是我们自己用python代码构建的数据结构.迭代器都是提供的,或者转化得来的. 获取生成 ...