|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 |
#include<iostream>#include<stdio.h>using
namespace
std;int
sum;int
ans;struct
Tree{ int
a,b; int
sum; int
ans; Tree *lchile,*rchile;};int
swap(int
x,int
y){ if(x>y) return
x; else return
y;} Tree *build(int
l,int
r){ Tree *root=new
Tree; root->a=l; root->b=r; root->sum=0; root->ans=-1; root->lchile=NULL; root->rchile=NULL; if(l<r) { int
mid=(l+r)>>1; root->lchile=build(l,mid); root->rchile=build(mid+1,r); } return
root;}void
insert(Tree *root,int
l,int
k){ if((root->a==l)&&(root->b==l)) { root->ans=k; root->sum=k; return
; } int
mid=(root->a+root->b)>>1; if(mid>=l) { insert(root->lchile,l,k); } else { insert(root->rchile,l,k); } root->sum=root->lchile->sum+root->rchile->sum; root->ans=swap(root->lchile->ans,root->rchile->ans);}void
search(Tree *root,int
l,int
r){ if(root->a>=l&&root->b<=r) { if(root->ans>ans) ans=root->ans; sum+=root->sum; return
; } int
mid=(root->a+root->b)>>1; if(mid>=r) { search(root->lchile,l,r); } else
if(mid<l) { search(root->rchile,l,r); } else { search(root->lchile,l,mid); search(root->rchile,mid+1,r); }}int
main(){ Tree *root=new
Tree; int
n,m,i,s,c,b,t; cin>>n>>m; root=build(1,n); for(i=1;i<=n;i++) { cin>>t; insert(root,i,t); } for(i=1;i<=m;i++) { int
ch; cin>>ch; if(ch==1) { cin>>s>>b; insert(root,s,b); } else { sum=0; ans=-1; cin>>s>>b; search(root,s,b); if(ch==2) cout<<sum<<endl; if(ch==3) cout<<ans<<endl; } } return
0;} |
原文:http://www.cnblogs.com/MonkeyAC/p/3534934.html