fork download
  1.  
  2. import java.util.*;
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.util.StringTokenizer;
  7.  
  8. class main
  9. {
  10. public static void main(String args[]) throws Exception
  11. {
  12. int T = Integer.parseInt(br.readLine());
  13. int N,start,end,i,left_sum,right_sum,left_neg1,left_neg2,right_neg1,right_neg2,ans,sum,top,bottom;
  14. String s[];
  15. int A[] = new int[200005];
  16. while(T--!=0)
  17. {
  18. left_neg2 = left_neg1 = right_neg2 = right_neg1 = sum = left_sum = right_sum = 0;
  19. N = Integer.parseInt(br.readLine());
  20. s = br.readLine().split(" ");
  21. for (i=1;i<=N;++i)
  22. A[i] = Integer.parseInt(s[i-1]);
  23. s = br.readLine().split(" ");
  24. start = Integer.parseInt(s[0]);
  25. end = Integer.parseInt(s[1]);
  26. //Summing the left and right parts
  27. for( i=start; true; ++i)
  28. {
  29. if(i>N)
  30. i%=N;
  31. if(i==end)
  32. break;
  33. left_sum += A[i];
  34. }
  35. for( i=(start-1); true; --i)
  36. {
  37. if(i==0)
  38. i=N;
  39. right_sum += A[i];
  40. if(i==end)
  41. break;
  42. }
  43. //System.out.println("left_sum: " + left_sum);
  44. //System.out.println("right_sum: " + right_sum);
  45. top = bottom = sum = 0;
  46. // Taking manimum negative values for left part
  47. for( i=start; true; ++i)
  48. {
  49. if(i>N)
  50. i%=N;
  51. if(i==end)
  52. break;
  53. sum += A[i];
  54. if(left_neg1>sum)
  55. {
  56. top = i;
  57. left_neg1 = sum;
  58. }
  59. }
  60. sum = 0;
  61. for( i=(end-1); true; --i)
  62. {
  63. if(i==0)
  64. i=N;
  65. sum += A[i];
  66. if(left_neg2>sum)
  67. {
  68. bottom = i;
  69. left_neg2 = sum;
  70. }
  71. if(i==start )
  72. break;
  73. }
  74. //System.out.println("top: " + top);
  75. //System.out.println("bottom: " + bottom);
  76. if(left_neg1 < left_neg2)
  77. {
  78. left_neg2 = sum = 0;
  79. for( i=(end-1); true; --i)
  80. {
  81. if(i==0)
  82. i=N;
  83. sum += A[i];
  84. if(left_neg2>sum)
  85. left_neg2 = sum;
  86. if(i==start || i==((top+1)==N+1 ? 1 : (top + 1)) )
  87. break;
  88. }
  89. }
  90. else
  91. {
  92. left_neg1 = sum = 0;
  93. for( i=start; true; ++i)
  94. {
  95. if(i>N)
  96. i%=N;
  97. if(i==end || i==bottom)
  98. break;
  99. sum += A[i];
  100. if(left_neg1>sum)
  101. left_neg1 = sum;
  102. }
  103. }
  104. //System.out.println("left_neg1: " + left_neg1);
  105. //System.out.println("left_neg2: " + left_neg2);
  106. ans = right_sum + left_neg1*2 + left_neg2*2;
  107. //Taking minimum negative values for right part
  108. top = bottom = sum = 0;
  109. for( i=(start-1); true; --i)
  110. {
  111. if(i==0)
  112. i=N;
  113. sum += A[i];
  114. if(right_neg1>sum)
  115. {
  116. top = i;
  117. right_neg1 = sum;
  118. }
  119. if(i==end)
  120. break;
  121. }
  122. sum = 0;
  123. for( i=end; true; ++i)
  124. {
  125. if(i>N)
  126. i%=N;
  127. if(i==start)
  128. break;
  129. sum += A[i];
  130. if(right_neg2>sum)
  131. {
  132. bottom = i;
  133. right_neg2 = sum;
  134. }
  135. }
  136. if(right_neg2 < right_neg1)
  137. {
  138. right_neg1 = sum = 0;
  139. for( i=(start-1); true; --i)
  140. {
  141. if(i==0)
  142. i=N;
  143. sum += A[i];
  144. if(right_neg1>sum)
  145. right_neg1 = sum;
  146. if(i==end || i==((bottom + 1)==N+1 ? N : (bottom + 1)) )
  147. break;
  148. }
  149. }
  150. else
  151. {
  152. sum = right_neg2 = 0;
  153. for( i=end; true; ++i)
  154. {
  155. if(i>N)
  156. i%=N;
  157. if(i==start || i==(top))
  158. break;
  159. sum += A[i];
  160. if(right_neg2>sum)
  161. right_neg2 = sum;
  162. }
  163. }
  164. //System.out.println("right_neg1: " + right_neg1);
  165. //System.out.println("right_neg2: " + right_neg2);
  166. ans = Math.min(ans,left_sum + right_neg1*2 + right_neg2*2);
  167. System.out.println(ans);
  168. }
  169. }
  170. }
Success #stdin #stdout 0.04s 320576KB
stdin
2
4
1 2 1 1
1 3
5
-5 100 100 100 2
1 5
stdout
2
-8