Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstdio>
- #include<stack>
- #include<queue>
- #include<set>
- #include<iomanip>
- #include<complex>
- #include<vector>
- #include<map>
- #include<algorithm>
- #include<cmath>
- #include<string>
- #include<bitset>
- #include<memory.h>
- #include<cassert>
- #include<ctime>
- using namespace std;
- #pragma comment(linker, "/STACK:36777216")
- #define For(i,l,r) for (int i = l; i < r + 1; i ++)
- #define ForI(it , s , T) for (T :: iterator it = s.begin(); it != s.end() ; ++ it )
- #define LL long long
- #define iinf 1000000000
- #define linf 4000000000000000000LL
- #define MOD (1000000007)
- #define Pi 3.1415926535897932384
- #define bit(mask,i) ((mask>>i)&1)
- #define pb(x) push_back(x)
- #define mk(x,y) make_pair(x,y)
- #define sqr(x) ((x)*(x))
- #define pause cin.get();cin.get();
- #define fir first
- #define sec second
- #define ln(x) log(x)
- #define pii pair<int,int>
- #define y1 y23423423
- const int Nmax = 100100;
- const int Direction[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
- struct Segm {
- int l, r;
- int color;
- bool isColored;
- LL sum;
- Segm(){};
- } tree[4*Nmax];
- void build(int v,int l,int r) {
- tree[v].l = l, tree[v].r = r;
- tree[v].isColored = false;
- tree[v].color = tree[v].sum = 0;
- if (l == r) return ;
- int mid = (l + r) >> 1;
- build(v + v, l, mid);
- build(v + v + 1, mid + 1, r);
- }
- inline void push(int v) {
- if (!tree[v].isColored) return ;
- tree[v].sum += (tree[v].r - tree[v].l + 1) * 1ll * tree[v].color;
- tree[v].isColored = false;
- int x = tree[v].color;
- tree[v].color = 0;
- if (tree[v].l == tree[v].r) return ;
- tree[v + v].color += x;
- tree[v + v + 1].color += x;
- tree[v + v].isColored = tree[v + v + 1].isColored = true;
- }
- void update(int v,int l,int r,int x) {
- push(v);
- if (tree[v].l == l && tree[v].r == r) {
- tree[v].isColored = true;
- tree[v].color = x;
- return ;
- }
- int mid = (tree[v].l + tree[v].r) >> 1;
- if (l <= mid)
- update(v + v, l, min(mid, r), x);
- if (r > mid)
- update(v + v + 1, max(mid + 1, l), r, x);
- push(v + v), push(v + v + 1);
- tree[v].sum = (tree[v + v].sum + tree[v + v + 1].sum);
- }
- LL getSum(int v,int l,int r) {
- if (l > r) return 0;
- push(v);
- if (tree[v].l == l && tree[v].r == r) {
- return tree[v].sum;
- }
- int mid = (tree[v].l + tree[v].r) >> 1;
- return getSum(v + v, l, min(r,mid)) + getSum(v + v + 1, max(l, mid + 1), r);
- }
- int main() {
- ios_base::sync_with_stdio(0);
- int n,q;
- cin >> n >> q;
- build(1,1,n);
- while (q --> 0) {
- int ch;
- cin >> ch;
- if (ch == 0) {
- int l,r,x;
- cin >> l >> r >> x;
- update(1,l,r,x);
- }
- else {
- int l,r;
- cin >> l >> r;
- cout << getSum(1,l,r) << endl;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement