diff --git a/src/8/18/segtreerange.cpp b/src/8/18/segtreerange.cpp new file mode 100644 index 0000000..33909a3 --- /dev/null +++ b/src/8/18/segtreerange.cpp @@ -0,0 +1,86 @@ +#include +#include +#include + +using ll = int64_t; + +ll n; +std::vector t; +std::vector v; +std::vector lazy; + +ll create(ll cur,ll l,ll r){ + if(l==r){ + t[cur]=v[l]; + return v[l]; + } + ll mid = (l+r)/2; + t[cur]=create(2*cur, l, mid) + + create(2*cur+1, mid+1, r); + return t[cur]; +} + + +ll rangeadd(ll cur, ll l, ll r, ll ql, ll qr, ll val) { + if (lazy[cur] != 0) { + t[cur] += lazy[cur] * (r - l + 1); + if (l != r) { + lazy[2 * cur] += lazy[cur]; + lazy[2 * cur + 1] += lazy[cur]; + } + lazy[cur] = 0; + } + if (ql > r || qr < l) return t[cur]; + if (ql <= l && r <= qr) { + t[cur] += val * (r - l + 1); + if (l != r) { + lazy[2 * cur] += val; + lazy[2 * cur + 1] += val; + } + return t[cur]; + } + ll mid = (l + r) / 2; + return t[cur] = rangeadd(2 * cur, l, mid, ql, qr, val) + + rangeadd(2 * cur + 1, mid + 1, r, ql, qr, val); +} + +ll rangequery(ll cur, ll l, ll r, ll ql, ll qr) { + if (lazy[cur] != 0) { + t[cur] += lazy[cur] * (r - l + 1); + if (l != r) { + lazy[2 * cur] += lazy[cur]; + lazy[2 * cur + 1] += lazy[cur]; + } + lazy[cur] = 0; + } + if (ql > r || qr < l) return 0; + if (ql <= l && r <= qr) return t[cur]; + ll mid = (l + r) / 2; + return rangequery(2 * cur, l, mid, ql, qr) + + rangequery(2 * cur + 1, mid + 1, r, ql, qr); +} + +int main(){ + std::cin>>n; + t.resize((n+1)*4); + v.resize(n+1); + lazy.resize((n+1)*4); + for(ll i=1; i<=n; i++){ + std::cin>>v[i]; + } + create(1, 1, n); + ll q; + std::cin>>q; + while(q--){ + ll l, r, val; + std::cin>>l>>r>>val; + rangeadd(1, 1, n, l, r, val); + std::cout << t[1] << "\n"; + } + std::cin>>q; + while(q--){ + ll l, r; + std::cin>>l>>r; + std::cout << rangequery(1, 1, n, l, r) << "\n"; + } +} \ No newline at end of file diff --git a/src/test.cpp b/src/test.cpp index 3e2d2b5..c7d4a71 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -1,7 +1,64 @@ -#include -#include -#include -int main(){ - auto p = new int(); - std::cout< +class MyLinkedList { +public: + std::list l; + MyLinkedList() { + + } + + int get(int index) { + if(index>=l.size()){ + return -1; + } + auto p = l.begin(); + while(index--){ + p++; + } + return *p; + } + + void addAtHead(int val) { + l.push_front(val); + } + + void addAtTail(int val) { + l.push_back(val); + } + + void addAtIndex(int index, int val) { + if(index==l.size()){ + l.push_back(val); + return; + } + if(index>l.size())return; + auto p = l.begin(); + while(index--){ + ++p; + } + l.insert(p,val); + } + + void deleteAtIndex(int index) { + if(0<=index && indexget(index); + * obj->addAtHead(val); + * obj->addAtTail(val); + * obj->addAtIndex(index,val); + * obj->deleteAtIndex(index); + */ + + int main(){ + + } \ No newline at end of file