求条玄关
查看原帖
求条玄关
1068500
sto__Liyhzh__orz楼主2025/1/20 11:47

TLE on 8,9,10

玄关

#include<bits/stdc++.h>
#define endl '\n'
#define lowbit(x) (x)&(-x)
#define int long long 
using namespace std;

typedef double db;
typedef long long ll;
typedef __int128 III;
const db eqs=1e-6;
const int inf=1e9;
void ll_cmax(ll &a,ll b){a=a>b?a:b;}
void ll_cmin(ll &a,ll b){a=a<b?a:b;}
void int_cmax(int &a,int b){a=a>b?a:b;}
void int_cmin(int &a,int b){a=a<b?a:b;}
bool db_eq(db a,db b){return fabs(a-b)<eqs;}
bool number(char ch){return ch>='0' && ch<='9';}
bool lowerchar(char ch){return ch>='a' && ch<='z';}
int sqlong(int n){int sq=sqrt(n)+1;return min(sq,n);}

vector<int>a;
int n,m;

namespace SGT
{
	constexpr int rt=1;
	struct T
	{
		ll sum=0,tag=0;
	}t0;
	vector<T>t;
	int n;
	
	T merge(T x,T y)
	{
		T z;
		z.sum=x.sum+y.sum;
		return z;
	}
	
	void push_down(int p,int l,int r)
	{
		int mid=(l+r)/2;
		t[p*2].tag+=t[p].tag;t[p*2+1].tag+=t[p].tag;
		t[p*2].sum+=(mid-l+1)*t[p].tag;
		t[p*2+1].sum+=(r-mid)*t[p].tag;
		t[p].tag=0;
	}
	
	void build(vector<int>a,int l=0,int r=n-1,int x=rt)
	{
		if(l==r) {t[x].sum=a[l];return;}
		int mid=(l+r)/2;
		build(a,l,mid,2*x);
		build(a,mid+1,r,2*x+1);
		t[x]=merge(t[2*x],t[2*x+1]);
	}
	
	void sgt(vector<int>a)
	{
		n=a.size();
		t.resize(n<<2);
		build(a);
	}
	
	void modify(int al,int ar,ll num,int l=0,int r=n-1,int x=rt)
	{
		if(l>ar || r<al) return ;
		if(l>=al && r<=ar) {t[x].tag+=num;t[x].sum+=num*(r-l+1);return ;}
		push_down(x,l,r);
//		cout<<"ok";
		int mid=(l+r)/2;
		modify(al,ar,num,l,mid,x*2);
		modify(al,ar,num,mid+1,r,x*2+1);
		t[x]=merge(t[x*2],t[x*2+1]);
	}
	
	T query(int al,int ar,int l=0,int r=n-1,int x=rt)
	{
//		cout<<l<<" "<<r<<endl;
		if(ar<l || al>r) return t0;
		if(ar>=r && al<=l) return t[x];       
		push_down(x,l,r);                  
		int mid=(l+r)/2;
		return merge(query(al,ar,l,mid,x*2),query(al,ar,mid+1,r,x*2+1));
	}
} 

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	ll x;
	for(int i=1;i<=n;i++) cin>>x,a.push_back(x);
	SGT::sgt(a);
	int id,l,r;
// 	ll x; 
	while(m--)
	{
		cin>>id;
		if(id==1) 
		{ 
			cin>>l>>r>>x;
			SGT::modify(l-1,r-1,x);
		}
		else
		{
			cin>>l>>r;
			cout<<SGT::query(l-1,r-1).sum<<endl;
		}
	}
	return 0;
}
/*
3 3 7 4 0                



3

*/
2025/1/20 11:47
加载中...