线段树求调
  • 板块学术版
  • 楼主Monomial
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/6/2 23:53
  • 上次更新2023/10/28 00:03:43
查看原帖
线段树求调
556013
Monomial楼主2022/6/2 23:53

码风不太友善

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<functional>

//#define fIO
//#define Mul
//#define quickmode

#ifdef quickmode
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#endif

#define GC getchar()
#define _PC(a) putchar(a)
#define ll long long
#define __FREOPEN__(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);

using namespace std;

bool _u(char c) {
    return ((c<='9' && c>='0') || c=='-');
}

bool _d(char c) {
    return (_u(c) || c=='.');
}

template <typename t> void double_read(t &a) {
    a=0.;
    int t1=1;
    char c=GC;
    while(!_d(c)) c=GC;
    if(c=='-') t1=-1;
    else if(c!='.') a=c-'0';
    while((c=GC)!='.' && _u(c)) {
        a=a*10.+c-'0';
    }
    double k=.1;
    if(_d(c)) while(_u(c=GC)) a+=k*(c-'0'),k*=.1;
    a*=t1;
}

template <typename t> void int_read(t &a) {
    a=0;
    int t1=1;
    char c=GC;
    while(!_u(c)) c=GC;
    if(c=='-') t1=-1,c=GC;
    a=(c-'0');
    while(_u(c=GC)) a=a*10+(c-'0');
    a*=t1;
}

/*template <typename t> void read(t &a) {
    if(std::is_same<t,double>::value || std::is_same<t,float>::value) double_read(a);
    else int_read(a);
}*/

template <typename t> void int_rwrite(t a) {
    if(!a) return ;
    int_rwrite(a/10);
    _PC((a%10)+48);
}

template <typename t> void rwrite(t a) {
    int_rwrite(a);
}

template <typename t> void write(t a) {
    if(!a) _PC('0');
    else if(a<0) _PC('-'),rwrite(-a);
    else rwrite(a);
}

ll num[100005]={};

ll tree[3200005]={},tree2[3200005]={},tree3[3200005]={};

ll n,m,p;

void build(ll l,ll r,ll pt) {
	if(l>r) return ;
	if(l==r) {
		tree[pt]=num[l];
		return ;
	}
	ll mid=(l+r)>>1;
	build(l,mid,pt<<1);
	build(mid+1,r,(pt<<1)|1);
	tree[pt]=tree[pt<<1]+tree[(pt<<1)|1];
}

ll get(ll l,ll r,ll l2,ll r2,ll pt) {
	if(l2<=l && r<=r2) {
		return tree[pt]+(r-l+1)*tree3[pt];
	}
	ll mid=(l+r)>>1;
	ll ans=0;
	tree3[pt<<1]+=tree3[pt];
	tree3[(pt<<1)|1]+=tree3[pt];
	if(l2<=mid) ans+=get(l,mid,l2,r2,pt<<1);
	if(r2>mid) ans+=get(mid+1,r,l2,r2,(pt<<1)|1);
	tree3[pt<<1]-=tree3[pt];
	tree3[(pt<<1)|1]-=tree3[pt];
	return ans;
}

void update_add(ll l,ll r,ll l2,ll r2,ll pt,ll adn) {
//	write(l),_PC(32),write(r),_PC(10);
	if(l2<=l && r<=r2) {
		if(l!=r) tree3[pt]+=adn;
		tree2[pt]=(r-l+1)*adn;
		tree[pt]+=tree2[pt];
		return ;
	}
	ll mid=(l+r)>>1;
	tree2[pt<<1]=tree2[(pt<<1)|1]=0;
	if(l2<=mid) update_add(l,mid,l2,r2,pt<<1,adn);
	if(r2>mid) update_add(mid+1,r,l2,r2,(pt<<1)|1,adn);
	tree2[pt]=tree2[pt<<1]+tree2[(pt<<1)|1];
	tree[pt]+=tree2[pt];
}

void update_mul(ll l,ll r,ll l2,ll r2,ll pt,ll mtn) {
	
}

void wk() {
    int_read(n),int_read(m);//,int_read(p);
    for(ll i=1;i<=n;++i) int_read(num[i]);
    build(1,n,1);
    while(m--) {
    	ll ty;
    	int_read(ty);
    	if(ty==1) {
    		ll x,y,k;
    		int_read(x),int_read(y),int_read(k);
    		update_add(1,n,x,y,1,k);
    	}
    	else {
    		ll x,y;
    		int_read(x),int_read(y);
    		write(get(1,n,x,y,1)),_PC(10);
    		/*while(x<=y) {
    			write(get(1,n,x,x,1)),_PC(10);
    			++x;
    		}*/
    	}
    }
}

signed main() {
    #ifdef fIO
    __FREOPEN__()
    #endif

    int t;
    #ifdef Mul
    int_read(t);
    #else
    t=1;
    #endif
    
    while(t--) wk();
}
2022/6/2 23:53
加载中...