fork download
  1. #include <bits/stdc++.h>
  2. #define SZ(X) ((int)(X).size())
  3. #define ALL(X) (X).begin(), (X).end()
  4. #define REP(I, N) for (int I = 0; I < (N); ++I)
  5. #define REPP(I, A, B) for (int I = (A); I < (B); ++I)
  6. #define RREP(I, N) for (int I= (N)-1; I>=0; --I)
  7. #define RREPP(I, A, B) for(int I = (B)-1; I>=A; --I)
  8. #define CASET int ___T, case_n = 1; scanf("%d ", &___T); while (___T-- > 0)
  9. #define MP make_pair
  10. #define PB push_back
  11. #define MS0(X) memset((X), 0, sizeof((X)))
  12. #define MS1(X) memset((X), -1, sizeof((X)))
  13. #define LEN(X) strlen(X)
  14. #define F first
  15. #define S second
  16. #define debug(A) REP(i, A.size()) cerr << A[i] << ' '; cerr << '\n'
  17. using namespace std;
  18.  
  19. typedef pair<int, int> ii;
  20. typedef vector<int> vi;
  21. typedef vector<vi> vvi;
  22.  
  23. typedef long long lld;
  24. typedef unsigned long long ulld;
  25. typedef pair<lld, lld> plld;
  26. typedef vector<lld> vlld;
  27. typedef vector<vlld> vvlld;
  28.  
  29. typedef long double ld;
  30. typedef vector<ld> vld;
  31. typedef vector<vld> vvld;
  32.  
  33. struct snode {
  34. int i, j; lld rsum;
  35. snode *l, *r;
  36. ~snode() { delete l; delete r; }
  37. snode(int i, int j, const vlld& arr ): i(i), j(j), rsum(0LL) {
  38. if (j - i == 1) {
  39. l = r = NULL; rsum=arr[i];
  40. } else {
  41. int k = i + j >> 1;
  42. l = new snode(i, k, arr); r = new snode(k, j, arr);
  43. rsum = l->rsum + r->rsum;
  44. }
  45. }
  46. void modify(int I, int J){
  47. if( rsum == j - i || j <= I || J <= i ) return;
  48. if( j - i == 1 ){
  49. rsum = (lld) sqrt(rsum);
  50. }else{
  51. l->modify(I,J); r->modify(I,J);
  52. rsum = l->rsum + r->rsum;
  53. }
  54. }
  55. lld sum(int I, int J){
  56. if( I <= i && j <= J ) return rsum;
  57. else if( j <= I || J <= i ) return 0LL;
  58. else return l->sum(I, J) + r->sum(I, J);
  59. }
  60. };
  61.  
  62. struct segment {
  63. snode *root;
  64. void init(int n, const vlld& arr) {
  65. if(root) delete root;
  66. root = new snode(0, n, arr);
  67. }
  68. lld sum(int i, int j){
  69. if(i>j) swap(i, j);
  70. return root->sum(i, j+1);
  71. }
  72. void modify(int i, int j){
  73. if(i>j) swap(i,j);
  74. return root->modify(i, j+1);
  75. }
  76. };
  77. const int MAXN=1e5+10;
  78. int N, Q, a,b,c, tc; vlld Ai(MAXN);
  79. int main(){
  80. while(scanf("%d",&N)!=EOF){
  81. printf("Case #%d:\n", ++tc);
  82. for(int i=0;i<N;i++) scanf("%lld",&Ai[i]);
  83. segment tree; tree.init(N, Ai); scanf("%d",&Q);
  84. for(int i=0;i<Q;i++){
  85. scanf("%d%d%d",&a,&b,&c); b--; c--;
  86. if(a==0) tree.modify(b, c);
  87. else if(a==1) printf("%lld\n", tree.sum(b, c));
  88. } printf("\n");
  89. }
  90. return 0;
  91. }
Success #stdin #stdout 0s 3456KB
stdin
5
1 2 3 4 5
5
1 2 4
0 2 4
1 2 4
0 4 5
1 1 5
4
987654321 987654321 987654321 987654321 
3
1 1 4
0 2 3
1 1 4
stdout
Case #1:
9
4
6

Case #2:
3950617284
1975371494