Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- /* Uzumaki Naruto */
- #define TRACE
- #ifdef TRACE
- #define dbgarr(a,n) cerr << "["; for(LL i = 0; i < n; ++i) cerr << a[i] << " ";cerr << "\b]\n";
- #define dbg(args...) {debug,args; cerr<<endl;}
- #define pause() cin.get();cin.get();
- #else
- #define dbgarr(a,n)
- #define dbg(args...)
- #define pause()
- #endif
- struct debugger {
- template<typename T> debugger& operator , (const T& v) {
- cerr<<v<<" "; return *this;
- }
- } debug;
- template <typename T1, typename T2>
- inline ostream& operator << (ostream& os, const pair<T1, T2>& p) {
- return os << "(" << p.first << ", " << p.second << ")";
- }
- template<typename T>
- inline ostream &operator << (ostream & os,const vector<T>& v) {
- bool first = true; os << "[";
- for (typename vector<T>::const_iterator ii = v.begin(); ii != v.end(); ++ii) {
- if(!first) os << ", ";
- os << *ii; first = false;
- }
- return os << "]";
- }
- #define fr first
- #define se second
- typedef long long LL;
- typedef pair<LL,LL> pii;
- typedef vector<LL> vi;
- const LL NN = 251234;
- LL seg[4*NN], lazy[4*NN];
- LL A[4*NN], D[4*NN];
- bool up[4*NN];
- LL sum(LL a,LL d,LL n){
- LL ans = (n*(2LL*a+(n-1)*d))/2LL;
- return ans;
- }
- void push_down(LL node,LL st,LL en){
- if (up[node]){
- seg[node] = (en-st+1)* lazy[node];
- if (st != en){
- lazy[2*node] = lazy[node], lazy[2*node+1] = lazy[node];
- up[2*node] = up[2*node+1] = true;
- A[2*node] = D[2*node] = A[2*node+1] = D[2*node+1] = 0;
- }
- up[node] = false;
- }
- if (A[node] != 0 or D[node] != 0){
- seg[node] += sum(A[node],D[node],en-st+1);
- if (st != en){
- LL mid = (st+en)/2;
- A[2*node] += A[node], D[2*node] += D[node];
- A[2*node+1] += (A[node] + (mid+1LL-st)*D[node]), D[2*node+1] += D[node];
- }
- A[node] = D[node] = 0;
- }
- }
- void update_inc(LL node,LL st,LL en,LL L,LL R,LL fr,LL d){
- push_down(node,st,en);
- if (st > en or st > R or en < L) return;
- if (st >= L and en <= R){
- A[node] += fr, D[node] += d;
- push_down(node,st,en);
- return;
- }
- LL mid = (st+en)/2;
- update_inc(2*node,st,mid,L,R,fr,d);
- update_inc(2*node+1,mid+1,en,L,R,fr+(mid+1-L)*d,d);
- seg[node] = seg[2*node] + seg[2*node+1];
- }
- void update_set(LL node,LL st,LL en,LL L,LL R,LL x){
- push_down(node,st,en);
- if (st > en or st > R or en < L) return;
- if (st >= L and en <= R){
- A[node] = D[node] = 0;
- lazy[node] = x;
- up[node] = true;
- push_down(node,st,en);
- return;
- }
- LL mid = (st+en)/2;
- update_set(2*node,st,mid,L,R,x);
- update_set(2*node+1,mid+1,en,L,R,x);
- seg[node] = seg[2*node] + seg[2*node+1];
- }
- LL query(LL node,LL st,LL en,LL L,LL R){
- push_down(node,st,en);
- if (st > en or st > R or en < L) return 0LL;
- if (st >= L and en <= R) return seg[node];
- LL mid = (st+en)/2;
- LL ans = 0;
- ans += query(2*node,st,mid,L,R);
- ans += query(2*node+1,mid+1,en,L,R);
- return ans;
- }
- void solve(){
- LL n,t,st,en;
- LL x;
- cin >> n;
- while(n--){
- cin >> t >> st >> en;
- if (t == 4)
- cout << query(1,0,NN-1,st-1,en-1) << endl;
- else if (t == 3){
- cin >> x;
- update_set(1,0,NN-1,st-1,en-1,x);
- } else if (t == 1)
- update_inc(1,0,NN-1,st-1,en-1,1LL,1LL);
- else {
- update_inc(1,0,NN-1,st-1,en-1,(en-st+1),-1LL);
- }
- }
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement