码迷,mamicode.com
首页 > 其他好文 > 详细

线段树

时间:2017-09-24 10:45:13      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:point   else   print   ++   oid   scanf   name   int   main   

 

 

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 struct T{
 5     int l,r,v,tag;
 6 }t[4*100001];
 7 int n,m,l,r,c,opt,a[100001];
 8 int build(int x,int l,int r)
 9 {
10     t[x].l=l;t[x].r=r;t[x].tag=0;
11     if (l==r) return t[x].v=a[l];
12     int m=(l+r)/2;
13     return t[x].v=max(build(x*2,l,m),build(x*2+1,m+1,r));
14 }
15 void pushdown(int x)
16 {
17     if (t[x].tag==0) return;
18     t[x*2].v+=t[x].tag;
19     t[x*2+1].v+=t[x].tag;
20     t[x*2].tag+=t[x].tag;
21     t[x*2+1].tag+=t[x].tag;
22     t[x].tag=0;
23 }
24 int query(int x,int l,int r)
25 {
26     if (t[x].l==l&&t[x].r==r) return t[x].v;
27     pushdown(x);
28     int m=(t[x].l+t[x].r)/2;
29     if (r<=m) return query(x*2,l,r);
30     else if (l>=m+1) return query(x*2+1,l,r);
31     else return max(query(x*2,l,m),query(x*2+1,m+1,r));
32 }
33 int update(int x,int l,int r,int v)//segment
34 {
35     if (t[x].l==l&&t[x].r==r){t[x].tag+=v;return t[x].v+=v;}
36     pushdown(x);
37     int m=(t[x].l+t[x].r)/2;
38     if (r<=m) return t[x].v=max(t[x*2+1].v,update(x*2,l,r,v));
39     else if (l>=m+1) return t[x].v=max(t[x*2].v,update(x*2+1,l,r,v));
40     else return t[x].v=max(update(x*2,l,m,v),update(x*2+1,m+1,r,v));
41 }
42 /*
43 int update(int x,int l,int v)//point
44 {
45     if (t[x].l==t[x].r) return t[x].v=v;
46     int m=(t[x].l+t[x].r)/2;
47     if (l<=m) return t[x].v=max(t[x*2+1].v,update(x*2,l,v));
48     if (l>=m+1) return t[x].v=max(t[x*2].v,update(x*2+1,l,v));
49 }
50 */
51 int main()
52 {
53     scanf("%d",&n);
54     for (int i=1;i<=n;i++) scanf("%d",&a[i]);
55     build(1,1,n);
56     scanf("%d",&m);
57     for (int i=1;i<=m;i++)
58     {
59         scanf("%d%d%d",&opt,&l,&r);
60         if (opt==1)
61         {
62             scanf("%d",&c);
63             update(1,l,r,c);
64         }
65         if (opt==2) printf("%d\n",query(1,l,r));
66     }
67 }

 

线段树

标签:point   else   print   ++   oid   scanf   name   int   main   

原文地址:http://www.cnblogs.com/algonote/p/7586237.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!