小白逛公园

描述

小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了。

一开始,小白就根据公园的风景给每个公园打了分-.-。小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a、b两个公园)选择**连续**的一些公园玩。小白当然希望选出的公园的分数总和尽量高咯。同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化。

那么,就请你来帮小白选择公园吧。

格式

输入格式

第一行,两个整数N和M,分别表示表示公园的数量和操作(遛狗或者改变打分)总数。

接下来N行,每行一个整数,依次给出小白 开始时对公园的打分。

接下来M行,每行三个整数。第一个整数K,1或2。K=1表示,小新要带小白出去玩,接下来的两个整数a和b给出了选择公园的范围(1≤a,b≤N, a可以大于b!);K=2表示,小白改变了对某个公园的打分,接下来的两个整数p和s,表示小白对第p个公园的打分变成了s(1≤p≤N)。

其中,1≤N≤500 000,1≤M≤100 000,所有打分都是绝对值不超过1000的整数。

输出格式

小白每出去玩一次,都对应输出一行,只包含一个整数,表示小白可以选出的公园得分和的最大值。

样例1

样例输入1

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

样例输出1

2
-1

限制

各个测试点2s

分析

求最大子段和,线段树维护四个值,区间和,区间最大子段和,区间从左边开始的最大子段和,从右边开始的最大子段和。

最大值从左区间,右区间,中间取最大的

时限2S。

code

 #include<cstdio>
#include<algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 using namespace std;
const int MAXN = ; int mx[MAXN],sum[MAXN],lm[MAXN],rm[MAXN];
int n,q; void pushup(int rt)
{
sum[rt] = sum[rt<<]+sum[rt<<|];
lm[rt] = max(sum[rt<<]+lm[rt<<|],lm[rt<<]);
rm[rt] = max(sum[rt<<|]+rm[rt<<],rm[rt<<|]);
mx[rt] = max(max(mx[rt<<],mx[rt<<|]),rm[rt<<]+lm[rt<<|]);
}
void update(int l,int r,int rt,int x,int v)
{
if (l==r)
{
sum[rt] = mx[rt] = lm[rt] = rm[rt] = v;
return ;
} int m = (l+r)>>;
if (x<=m) update(lson,x,v);
else update(rson,x,v);
pushup(rt);
}
void build(int l,int r,int rt)
{
if (l==r)
{
scanf("%d",&sum[rt]);
mx[rt] = lm[rt] = rm[rt] = sum[rt];
return ;
}
int m = (l+r)>>;
build(lson);
build(rson);
pushup(rt);
}
int query_l(int l,int r,int rt,int L,int R)
{
if (l==L&&r==R) return rm[rt];
int m = (l+r)>>;
if (L>m) return query_l(rson,L,R);
else
{
int t1 = rm[rt<<|];
int t2 = sum[rt<<|]+query_l(lson,L,m);
return max(t1,t2);
}
}
int query_r(int l,int r,int rt,int L,int R)
{
if (l==L&&r==R) return lm[rt];
int m = (l+r)>>;
if (R<=m) return query_r(lson,L,R);
else
{
int t1 = lm[rt<<];
int t2 = sum[rt<<]+query_r(rson,m+,R);
return max(t1,t2);
}
}
int query(int l,int r,int rt,int L,int R)
{
if (L<=l&&r<=R) return mx[rt];
if (L>r||l>R) return ;
int m = (l+r)>>;
int ret = ,max_l = ,max_r = ,tl = ,tr = ;
if (L>m) return query(rson,L,R);
else if (R<=m) return query(lson,L,R);
else
{
tl = query(lson,L,m);
tr = query(rson,m+,R);
max_l = query_l(lson,L,m);
max_r = query_r(rson,m+,R);
return max(max(tl,tr),max_l+max_r);
}
}
int main()
{
scanf("%d%d",&n,&q);
build(,n,);
int opt,x,y;
while (q--)
{
scanf("%d%d%d",&opt,&x,&y);
if (opt==)
{
if (x>y) swap(x,y);
printf("%d\n",query(,n,,x,y));
}
else update(,n,,x,y);
}
return ;
}

最新文章

  1. 【NHibernate】列“ReservedWord”不属于表 ReservedWords
  2. Redis学习笔记~常用命令总结
  3. Apache下开启SSI配置使html支持include包含
  4. ios swift generator 文章推荐
  5. hdu1181 变形课
  6. Oracle DBA需掌握的命令集锦(推荐)
  7. linux面试题1
  8. MyEclipse SVN 插件
  9. SQL SERVER 分页方法
  10. DOM事件一览表
  11. 写java代码遇到的一些问题
  12. fiddler 监听HttpClient发送的请求
  13. 基于oracle的sql优化
  14. NGUI的新手引导的实现
  15. MySQL默认储存引擎修改
  16. Java语言中的奇淫技巧
  17. iframe的缺点
  18. 数据库更新锁WITH UPDLOCK
  19. day23(事务管理)
  20. 批量删除SQL数据库中的所有表【笔记】

热门文章

  1. Linux查找文件内容(grep)
  2. ajax的jquery写法和原生写法
  3. uvm_regex——DPI在UVM中的实现(三)
  4. Redis集群维护、运营的相关命令与工具介绍
  5. Winform调整DEV控件高度
  6. jQuery_3_过滤选择器
  7. linux 命令——13 less(转)
  8. 【BZOJ2733】[HNOI2012] 永无乡(启发式合并Splay)
  9. 数组使用NSUserDefaults存储的问题,
  10. 删除临时文件的bat文件