fork download
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.Scanner;
  5. import java.util.StringTokenizer;
  6. import java.util.*;
  7. class KGSS{
  8. static class FastReader
  9. {
  10.  
  11. public FastReader()
  12. {
  13. br = new BufferedReader(new
  14. }
  15.  
  16. String next()
  17. {
  18. while (st == null || !st.hasMoreElements())
  19. {
  20. try
  21. {
  22. st = new StringTokenizer(br.readLine());
  23. }
  24. catch (IOException e)
  25. {
  26. e.printStackTrace();
  27. }
  28. }
  29. return st.nextToken();
  30. }
  31.  
  32. int nextInt()
  33. {
  34. return Integer.parseInt(next());
  35. }
  36.  
  37. long nextLong()
  38. {
  39. return Long.parseLong(next());
  40. }
  41.  
  42. double nextDouble()
  43. {
  44. return Double.parseDouble(next());
  45. }
  46.  
  47. String nextLine()
  48. {
  49. String str = "";
  50. try
  51. {
  52. str = br.readLine();
  53. }
  54. catch (IOException e)
  55. {
  56. e.printStackTrace();
  57. }
  58. return str;
  59. }
  60. }
  61. public static void main(String args[]){
  62. FastReader sc=new FastReader();
  63. int n=sc.nextInt();
  64. int a[]=new int[n+1];
  65. int tree[]=new int[4*n+1];
  66. int asli_tree[]=new int[4*n+1];
  67.  
  68. for(int i=1;i<n+1;i++)
  69. {a[i]=sc.nextInt();}
  70. builtTree(1,n,a,tree,asli_tree,1);
  71.  
  72. int q=sc.nextInt();
  73. while(q-->0){
  74.  
  75. String z=sc.next();
  76. int x=sc.nextInt();
  77. int y=sc.nextInt();
  78. if(z.equals("Q"))
  79. {System.out.println(query(x,y,1,n,tree,asli_tree,1,1));}
  80. if(z.equals("U"))
  81. {update(y,x,0,n,tree,asli_tree,1);}
  82. }
  83. }
  84. public static void builtTree(int s,int e,int a[],int tree[],int asli_tree[],int index){
  85. if(s>e)
  86. {return;}
  87. if(s==e)
  88. {tree[index]=a[s];
  89. asli_tree[index]=a[s];
  90. return;}
  91.  
  92. builtTree(s,(s+e)/2,a,tree,asli_tree,index*2);
  93. builtTree((s+e)/2+1,e,a,tree,asli_tree,index*2+1);
  94.  
  95. tree[index]=Math.max(tree[2*index],tree[2*index+1]);
  96. asli_tree[index]=Math.max(tree[2*index]+tree[2*index+1],Math.max(asli_tree[2*index],asli_tree[2*index+1]));
  97.  
  98. }
  99. public static int query(int qs,int qe,int s,int e,int tree[],int asli_tree[],int index,int i){
  100. if(qs>e || qe<s)
  101. {return 0;}
  102. if(qs<=s && qe>=e && i==0)
  103. {return tree[index];}
  104. if(qs<=s && qe>=e && i==1)
  105. {return asli_tree[index];}
  106. int left=query(qs,qe,s,(s+e)/2,tree,asli_tree,index*2,0);//tree
  107. int left1=query(qs,qe,s,(s+e)/2,tree,asli_tree,index*2,1);//asli_tree
  108. int right=query(qs,qe,(s+e)/2+1,e,tree,asli_tree,index*2+1,0);
  109. int right1=query(qs,qe,(s+e)/2+1,e,tree,asli_tree,index*2+1,1);
  110.  
  111. if(index!=1 && i==0)
  112. {return Math.max(left,right);}
  113. if(index!=1 && i==1)
  114. {return Math.max(left+right,Math.max(left1,right1));}
  115. return Math.max(left+right,Math.max(left1,right1));
  116. }
  117. public static void update(int value,int i,int s,int e,int tree[],int asli_tree[],int index){
  118. if(i<s || i>e)
  119. {return;}
  120. if(s==e)
  121. {tree[index]=value;
  122. asli_tree[index]=value;
  123. return;}
  124. update(value,i,s,(s+e)/2,tree,asli_tree,index*2);
  125. update(value,i,(s+e)/2+1,e,tree,asli_tree,index*2+1);
  126. tree[index]=Math.max(tree[2*index],tree[2*index+1]);
  127. asli_tree[index]=Math.max(tree[2*index]+tree[2*index+1],Math.max(asli_tree[2*index],asli_tree[2*index+1]));
  128. }
  129. }
Success #stdin #stdout 0.1s 32740KB
stdin
5
1 2 3 4 5
6
Q 2 4
Q 2 5
U 1 6
Q 1 5
U 1 7
Q 1 5
stdout
7
9
11
12