给定一个循环数组a0, a1, a2, …, an-1,现在对他们有两个操作:

Inc(le, ri, v)表示区间[le, ri]范围的数值增加v

Rmq(le, ri)表示询问区间[le, ri]范围内的最小值

注意,这个是循环数组,所以如果n=5, le=3, ri=1,那么询问的是a3, a4, a0, a1中的最小值。

帮助BSNY写一个程序完成上述操作。

【数据规模和约定】

1<= n <=200000   0<=Q<=200000

-10^6<= ai <=10^6   0<=le, ri<=n-1   -10^6<= v <=10^6

简单的线段树区间加减,区间求最值。

注意max已经超过maxlongint

 const oo=;
var tree:array[..]of record
a,s:int64;
end;
a:array[..]of int64;
n,q,len,x,y,z,p:int64;
ch,s:string;
i,j,k:longint; procedure pushdown(p:int64);
begin
tree[p<<].s:=tree[p<<].s+tree[p].a;
tree[p<<].a:=tree[p<<].a+tree[p].a;
tree[p<<+].s:=tree[p<<+].s+tree[p].a;
tree[p<<+].a:=tree[p<<+].a+tree[p].a;
tree[p].a:=;
end; procedure pushup(p:int64);
begin
if tree[p<<].s<tree[p<<+].s then tree[p].s:=tree[p<<].s
else tree[p].s:=tree[p<<+].s;
// tree[p].s:=min(tree[p<<].s,tree[p<<+].s);
end; procedure build(l,r,p:int64);
var mid:int64;
begin
if l=r then
begin
tree[p].s:=a[l];
tree[p].a:=;
exit;
end;
mid:=(l+r)>>;
if l<=mid then build(l,mid,p<<);
if r>mid then build(mid+,r,p<<+);
pushup(p);
end; function query(l,r,x,y,p:int64):int64;
var mid:int64;t,ret:int64;
begin
if (x<=l)and(y>=r) then exit(tree[p].s);
pushdown(p);
mid:=(l+r)>>;
ret:=oo;
//query:=oo;
if x<=mid then ret:=query(l,mid,x,y,p<<);
if y>mid then
begin
t:=query(mid+,r,x,y,p<<+);
if t<ret then ret:=t; //query:=min(query,t);
end;
exit(ret);
end; procedure update(l,r,x,y,v,p:int64);
var mid:int64;
begin
if (x<=l)and(y>=r) then
begin
tree[p].s:=tree[p].s+v;
tree[p].a:=tree[p].a+v;
exit;
end;
pushdown(p);
mid:=(l+r)>>;
if x<=mid then update(l,mid,x,y,v,p<<);
if y>mid then update(mid+,r,x,y,v,p<<+);
pushup(p);
end; begin readln(n);
for i:= to n do read(a[i]);
for i:= to n<< do tree[i].s:=oo;
build(,n,);
readln(q);
for i:= to q do
begin
readln(ch); len:=length(ch);
p:=;
for j:= to len do
if ch[j]=' ' then inc(p);
if p= then
begin
x:=;
j:=;
repeat
inc(j);
if ch[j]<>' ' then x:=x*+ord(ch[j])-ord('')
else break;
until j=len;
y:=;
repeat
inc(j);
if ch[j]<>' ' then y:=y*+ord(ch[j])-ord('')
else break;
until j=len;
inc(x); inc(y);
if x<=y then writeln(query(,n,x,y,))
else
if query(,n,x,n,)<query(,n,,y,) then writeln(query(,n,x,n,))
else writeln(query(,n,,y,));
end
else
begin
x:=;
j:=;
repeat
inc(j);
if ch[j]<>' ' then x:=x*+ord(ch[j])-ord('')
else break;
until j=len;
y:=;
repeat
inc(j);
if ch[j]<>' ' then y:=y*+ord(ch[j])-ord('')
else break;
until j=len;
s:='';
for k:=j+ to len do s:=s+ch[k];
val(s,z);
inc(x); inc(y);
if x<=y then update(,n,x,y,z,)
else
begin
update(,n,x,n,z,);
update(,n,,y,z,);
end;
end;
end; end.
 

最新文章

  1. Windows API 函数列表 附帮助手册
  2. 前端福利!10个短小却超实用的JavaScript 代码段
  3. LA 3983 Robotruck
  4. 团体程序设计天梯赛-练习集L2-009. 抢红包
  5. windows下go开发环境部署 (sublime+gosublime+geocode)
  6. SVM(支持向量机)算法
  7. 解密yii中CModule::_components和CModule::_componentConfig
  8. ORACLE FLASHBACK DATABASE 知识整理
  9. Smarty自定义函数
  10. wget 下载百度网盘文件
  11. Django学习(3)模板定制
  12. TensorBoard的使用(结合线性模型)
  13. CTF---密码学入门第五题 传统知识+古典密码
  14. Object.create()和new object()和{}的区别
  15. 转:vim模式下报错E37: No write since last change (add ! to override)
  16. HDFS的命令
  17. .NET的前世今生与将来
  18. swagger 常用注解说明
  19. VS调试dll详细过程记录
  20. 第三节 java 数组

热门文章

  1. java基础—面向对象2
  2. CodePlus #4 最短路
  3. Nginx: ubuntu系统上查找nginx.conf配置文件的路径
  4. 解决cocos2dx 打包lua环境搭建问题( ImportError: No module named Cheetah.Template)
  5. (转发)IOS动画中的枚举UIViewAnimationOptions
  6. ReactiveCocoa概念解释篇
  7. 【转】 VC中TCP实现 异步套接字编程的原理+代码
  8. Python学习笔记5(函数)
  9. 【贪心 计数】bzoj2006: [NOI2010]超级钢琴
  10. mysqlfailover高可用与proxysql读写分离配置