This documentation is automatically generated by online-judge-tools/verification-helper
This project is maintained by tsutaj
// 次の2つのクエリに対応するRMQ // ・[a, b) の要素全てに x を加えるクエリ // ・[a, b) の和を計算するクエリ // (strc_006_bit_sec.cpp に BIT 版があり、そちらの方が速いです) // Verify: なし (POJ の問題が TLE した) template <typename T> class rmq_sec { public: vector<T> data, datb; rmq_sec(int n_) { int m = 1; while(m < n_) m *= 2; data.resize(2*m-1); datb.resize(2*m-1); } void add(int a, int b, int x, int k, int l, int r) { if(a <= l && r <= b) { data[k] += x; } else if(l < b && a < r) { datb[k] += (min(b, r) - max(a, l)) * x; add(a, b, x, k*2 + 1, l, (l + r) / 2); add(a, b, x, k*2 + 2, (l + r) / 2, r); } } ll sum(int a, int b, int k, int l, int r) { if(b <= l || r <= a) { return 0; } else if(a <= l && r <= b) { return data[k] * (r - l) + datb[k]; } else { ll res = (min(b, r) - max(a, l)) * data[k]; res += sum(a, b, k*2 + 1, l, (l + r) / 2); res += sum(a, b, k*2 + 2, (l + r) / 2, r); return res; } } };
#line 1 "structure/old/strc_003_segment_rmq_sec.cpp" // 次の2つのクエリに対応するRMQ // ・[a, b) の要素全てに x を加えるクエリ // ・[a, b) の和を計算するクエリ // (strc_006_bit_sec.cpp に BIT 版があり、そちらの方が速いです) // Verify: なし (POJ の問題が TLE した) template <typename T> class rmq_sec { public: vector<T> data, datb; rmq_sec(int n_) { int m = 1; while(m < n_) m *= 2; data.resize(2*m-1); datb.resize(2*m-1); } void add(int a, int b, int x, int k, int l, int r) { if(a <= l && r <= b) { data[k] += x; } else if(l < b && a < r) { datb[k] += (min(b, r) - max(a, l)) * x; add(a, b, x, k*2 + 1, l, (l + r) / 2); add(a, b, x, k*2 + 2, (l + r) / 2, r); } } ll sum(int a, int b, int k, int l, int r) { if(b <= l || r <= a) { return 0; } else if(a <= l && r <= b) { return data[k] * (r - l) + datb[k]; } else { ll res = (min(b, r) - max(a, l)) * data[k]; res += sum(a, b, k*2 + 1, l, (l + r) / 2); res += sum(a, b, k*2 + 2, (l + r) / 2, r); return res; } } };