题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 45334 Accepted Submission(s):
17789
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 struct node 8 { 9 int l,r; 10 int score; 11 } s[200000*4+10]; 12 13 void InitTree(int l,int r,int k) 14 { 15 s[k].l=l; 16 s[k].r=r; 17 s[k].score=0; 18 if (l==r) 19 return ; 20 int mid=(l+r)/2; 21 InitTree(l,mid,k*2); 22 InitTree(mid+1,r,2*k+1); 23 } 24 25 26 void UpdataTree(int i,int ad,int k) 27 { 28 if (s[k].l==s[k].r&&s[k].r==i) 29 { 30 s[k].score=ad; 31 return ; 32 } 33 int mid=(s[k].l+s[k].r)/2; 34 if (i<=mid) 35 { 36 UpdataTree(i,ad,k*2); 37 } 38 else if (i>mid) 39 { 40 UpdataTree(i,ad,k*2+1); 41 } 42 s[k].score=s[k*2].score>s[k*2+1].score?s[k*2].score:s[k*2+1].score; 43 } 44 45 int sum; 46 47 int SearchTree(int st,int e,int k) 48 { 49 if (st==s[k].l&&e==s[k].r) 50 { 51 return s[k].score; 52 } 53 int mid=(s[k].l+s[k].r)/2; 54 if (e<=mid) 55 return SearchTree(st,e,k*2); 56 else if (st>mid) 57 return SearchTree(st,e,k*2+1); 58 else 59 { 60 int a=SearchTree(st,mid,2*k); 61 int b=SearchTree(mid+1,e,2*k+1); 62 return a>b?a:b; 63 } 64 } 65 66 int main () 67 { 68 int n,m,a,x,y,ans; 69 char ch; 70 while (~scanf("%d%d",&n,&m)) 71 { 72 sum=0; 73 InitTree(1,n,1); 74 for (int i=1; i<=n; i++) 75 { 76 scanf("%d",&a); 77 UpdataTree(i,a,1); 78 } 79 for (int i=1; i<=m; i++) 80 { 81 getchar(); 82 scanf("%c",&ch); 83 if (ch==‘Q‘) 84 { 85 scanf("%d%d",&x,&y); 86 ans=SearchTree(x,y,1); 87 printf ("%d\n",ans); 88 } 89 else if (ch==‘U‘) 90 { 91 scanf("%d%d",&x,&y); 92 UpdataTree(x,y,1); 93 } 94 } 95 } 96 return 0; 97 }
原文:http://www.cnblogs.com/qq-star/p/4437410.html