Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <numeric>
- #include <fstream>
- #include <map>
- #include <algorithm>
- #include <bitset>
- #include <set>
- #include <vector>
- #include <utility>
- #include <cstring>
- #include <string>
- #include <cctype>
- #include <cmath>
- #include <climits>
- using namespace std;
- typedef vector<int> vi;
- typedef vector< vi > vvi;
- typedef pair<int,int> pi;
- typedef vector< pi > vpi;
- typedef vector< vpi > vvpi;
- #define rep(i,a,b) for(i = a;i<=b;i++)
- #define all(c) (c).begin(),(c).end()
- #define present(c,x) (c).find(x)!=(c).end()
- #define gpresent(c,x) find(all(c),x)
- #define tr(c,it) for( typeof( (c).begin()) it = (c).begin();it!=(c).end();it++ )
- #define accu(c) accumulate(all(c),0)
- #define scalar(c1,c2) inner_product(all(c1),(c2).begin(),0)
- #define maxel(c) max_element(all(c))
- #define minel(c) min_element(all(c))
- #define fx first
- #define sx second
- #define pb(a) push_back(a)
- #define mp(a,b) make_pair(a,b)
- #define inf -300010
- #define l(n) 2*n
- #define r(n) 2*n+1
- ifstream in("input.in",ios::in);
- ofstream out("output.out",ios::out);
- //////////////////////////////////////CODE START HERE//////////////////////////////////////////////
- ////////////*****************************************************************/////////////////////
- long long memo[10000000];
- long long lazy[10000000];
- //l(nd) and r(nd) are #defined.
- void update(int nd,int s,int e,int p,int q,int v){
- if(e<p||s>q||s>e)
- return;
- if(lazy[nd]!=0){
- memo[nd]+=(e-s+1)*lazy[nd];
- if(s!=e){
- lazy[l(nd)]+=lazy[nd]; //l(nd) is 2*nd
- lazy[r(nd)]+=lazy[nd]; //r(nd) is 2*nd+1
- }
- lazy[nd] = 0;
- }
- if(s>=p&&e<=q){
- memo[nd]+=(e-s+1)*v;
- if(s!=e){
- lazy[l(nd)]+=v;
- lazy[r(nd)]+=v;
- }
- return;
- }
- update(l(nd),s,(s+e)/2,p,q,v);
- update(r(nd),(s+e)/2+1,e,p,q,v);
- memo[nd] = memo[l(nd)] + memo[r(nd)];
- int m=(s+e)/2;
- //these lines have been added.
- if(lazy[l(nd)]!=0)
- memo[nd]+=(m-s+1)*lazy[l(nd)];
- if(lazy[r(nd)]!=0)
- memo[nd]+=(e-m)*lazy[r(nd)];
- return;
- }
- long long query(int nd,int s,int e,int p,int q){
- if(lazy[nd]!=0){
- memo[nd]+=(e-s+1)*lazy[nd];
- if(s!=e){
- lazy[l(nd)]+=lazy[nd];
- lazy[r(nd)]+=lazy[nd];
- }
- lazy[nd] = 0;
- }
- if(e<p||s>q||e<s)
- return -1;
- if(s>=p&&e<=q){
- return memo[nd];
- }
- long long p1 = query(l(nd),s,(s+e)/2,p,q);
- long long p2 = query(r(nd),(s+e)/2+1,e,p,q);
- long long sum = 0;
- if(p1>0)
- sum+=p1;
- if(p2>0)
- sum+=p2;
- return sum;
- }
- int main(){
- int t,n,c,p,q,v,i,cs;
- scanf("%d",&t);
- while(t--){
- memset(memo,0,sizeof(memo));
- memset(lazy,0,sizeof(lazy));
- scanf("%d %d",&n,&c);
- rep(i,1,c){
- scanf("%d %d %d",&cs,&p,&q);
- if(cs)
- //printf("%lld\n",query(1,1,n,p,q));
- cout<<query(1,1,n,p,q)<<"\n";
- else{
- scanf("%d",&v);
- update(1,1,n,p,q,v);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement