fork download
  1. import java.io.*;
  2. import java.util.Arrays;
  3.  
  4. public class Main {
  5. public static void main(String[] args) throws IOException {
  6. int T = Integer.parseInt(br.readLine());
  7. while (T-- > 0) {
  8. String[] line = br.readLine().split(" ");
  9. int n = Integer.parseInt(line[0]);
  10. int q = Integer.parseInt(line[1]);
  11. int[] a = new int[n];
  12. line = br.readLine().split(" ");
  13. for (int i = 0; i < n; i++) {
  14. a[i] = Integer.parseInt(line[i]);
  15. }
  16. Arrays.sort(a);
  17. long[] preSum = new long[n + 1];
  18. for (int i = 1; i <= n; i++) {
  19. preSum[i] = preSum[i - 1] + a[i - 1];
  20. }
  21. long currentMin = Long.MAX_VALUE;
  22. while (q-- > 0) {
  23. line = br.readLine().split(" ");
  24. int op = Integer.parseInt(line[0]);
  25. if (op == 1) {
  26. int v = Integer.parseInt(line[1]);
  27. if (v < currentMin) {
  28. currentMin = v;
  29. }
  30. } else {
  31. if (currentMin == Long.MAX_VALUE) {
  32. bw.write(preSum[n] + "\n");
  33. } else {
  34. int pos = bisectRight(a, (int) currentMin);
  35. long sum = preSum[pos] + (n - pos) * currentMin;
  36. bw.write(sum + "\n");
  37. }
  38. }
  39. }
  40. }
  41. bw.flush();
  42. }
  43.  
  44. private static int bisectRight(int[] a, int key) {
  45. int low = 0, high = a.length;
  46. while (low < high) {
  47. int mid = (low + high) >>> 1; // 无符号右移避免溢出
  48. if (a[mid] > key) {
  49. high = mid;
  50. } else {
  51. low = mid + 1;
  52. }
  53. }
  54. return low;
  55. }
  56. }
Success #stdin #stdout 0.09s 55784KB
stdin
1
5 3
1 2 4 5 3
2 
1 2
2
stdout
15
9