第一次写线段树题,求调
查看原帖
第一次写线段树题,求调
495339
ONISINO楼主2024/2/24 21:23
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
const int MAXN=3e5+10,MOD=7;
int n;
set<int> pos;
struct tree{
	int l,r;
	ll a,d,num;
};
tree tr[4*MAXN];
ll value[MAXN];
void build(int l,int r,int i=1){
	tr[i].l=l;
	tr[i].r=r;
	tr[i].a=-1;
	tr[i].d=-1;
	tr[i].num=0;
	if(l==r){
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,2*i);
	build(mid+1,r,2*i+1);
}
void push_down(int i){
	int mid=(tr[i].l+tr[i].r)/2;
	if(tr[i].a>=0||tr[i].d>=0){
		//update lazytag of son
		tr[i<<1].a=tr[i].a+(tr[i].r-mid)*tr[i].d;
		tr[i<<1].d=tr[i].d;
		tr[i<<1|1].a=tr[i].a;
		tr[i<<1|1].d=tr[i].d;
		//reset lazytag
		tr[i].a=-1;
		tr[i].d=-1;
	}
	//update value of son
	if(tr[i<<1].a>=0||tr[i<<1].d>=0)
	tr[i<<1].num=tr[i<<1].a*(tr[i<<1].r-tr[i<<1].l+1)+(tr[i<<1].r-tr[i<<1].l)*(tr[i<<1].r-tr[i<<1].l+1)/2*tr[i<<1].d;
	if(tr[i<<1|1].a>=0||tr[i<<1|1].d>=0)
	tr[i<<1|1].num=tr[i<<1|1].a*(tr[i<<1|1].r-tr[i<<1|1].l+1)+(tr[i<<1|1].r-tr[i<<1|1].l)*(tr[i<<1|1].r-tr[i<<1|1].l+1)/2*tr[i<<1|1].d;
}
void modify(int l,int r,ll a,ll d,int i=1){
	if(l>r) return;
	if(l==tr[i].l&&tr[i].r==r){
		tr[i].a=a;
		tr[i].d=d;
		tr[i].num=tr[i].a*(tr[i].r-tr[i].l+1)+(tr[i].r-tr[i].l)*(tr[i].r-tr[i].l+1)/2*tr[i].d;
		return;
	}
	int mid=(tr[i].l+tr[i].r)/2;
	push_down(i);
	if(r<=mid){
		modify(l,r,a,d,i<<1);
	}else if(l>mid){
		modify(l,r,a,d,i<<1|1);
	}else{
		modify(l,mid,a+(r-mid)*d,d,i<<1);
		modify(mid+1,r,a,d,i<<1|1);
	}
	tr[i].num=tr[i<<1].num+tr[i<<1|1].num;
}
void add(int x,ll v){
	int l=1,r=n;
	pos.insert(x);
	value[x]=v;
	auto it=pos.lower_bound(x);
	auto L=it,R=it;
	modify(x,x,0,0);
	if(x!=1){
		L--;
		l=*L;
		modify(l+1,x-1,value[l],value[l]);
	}
	if(x!=n){
		R++;
		r=*R;
		modify(x+1,r-1,v,v);
	}
}
ll getsum(int l,int r,int i=1){
	push_down(i);
	if(l<=tr[i].l&&tr[i].r<=r){
		return tr[i].num;
	}
	int mid=(tr[i].l+tr[i].r)/2;
	ll sum=0;
	if(l<=mid){
		sum+=getsum(l,r,i<<1);
	}
	if(r>mid){
		sum+=getsum(l,r,i<<1|1); 
	}
	return sum;
}
void solve(){
	int m,q,op,a,b;
	cin>>n>>m>>q;
	build(1,n);
	pos.insert(1);
	pos.insert(n);
	vector<ll> x(m),v(m);
	for(int i=0;i<m;i++){
		cin>>x[i];
	}
	for(int i=0;i<m;i++){
		cin>>v[i];
		add(x[i],v[i]);
	}
	
	while(q--){
		cin>>op>>a>>b;
		if(op==1){
			add(a,b);
		}else{
			cout<<getsum(a,b)<<endl;
		}
	}
}

int main(){
	//ios::sync_with_stdio(false);
	//cin.tie(nullptr),cout.tie(nullptr);
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	return 0;
}
2024/2/24 21:23
加载中...