提交时间:2023-08-14 12:18:26

运行 ID: 98107

#include<bits/stdc++.h> using namespace std; int n,m,x[200005],y[200005]; int dis(int a,int b,int c,int d){ return abs(c-a)+abs(d-b); } struct node{ int xx,xy,yx,yy; }; node merge(node a,node b,int mid){ node ans=(node){0x3f3f3f3f,0x3f3f3f3f,0x3f3f3f3f,0x3f3f3f3f}; ans.xx=min(ans.xx,a.xx+b.xx+dis(mid+1,x[mid],mid+1,x[mid+1])+1); ans.xx=min(ans.xx,a.xx+b.yx+dis(mid+1,x[mid],y[mid+1],mid+1)+1); ans.xx=min(ans.xx,a.xy+b.xx+dis(y[mid],mid+1,mid+1,x[mid+1])+1); ans.xx=min(ans.xx,a.xy+b.yx+dis(y[mid],mid+1,y[mid+1],mid+1)+1); ans.xy=min(ans.xy,a.xx+b.xy+dis(mid+1,x[mid],mid+1,x[mid+1])+1); ans.xy=min(ans.xy,a.xx+b.yy+dis(mid+1,x[mid],y[mid+1],mid+1)+1); ans.xy=min(ans.xy,a.xy+b.xy+dis(y[mid],mid+1,mid+1,x[mid+1])+1); ans.xy=min(ans.xy,a.xy+b.yy+dis(y[mid],mid+1,y[mid+1],mid+1)+1); ans.yx=min(ans.yx,a.yx+b.xx+dis(mid+1,x[mid],mid+1,x[mid+1])+1); ans.yx=min(ans.yx,a.yx+b.yx+dis(mid+1,x[mid],y[mid+1],mid+1)+1); ans.yx=min(ans.yx,a.yy+b.xx+dis(y[mid],mid+1,mid+1,x[mid+1])+1); ans.yx=min(ans.yx,a.yy+b.yx+dis(y[mid],mid+1,y[mid+1],mid+1)+1); ans.yy=min(ans.yy,a.yx+b.xy+dis(mid+1,x[mid],mid+1,x[mid+1])+1); ans.yy=min(ans.yy,a.yx+b.yy+dis(mid+1,x[mid],y[mid+1],mid+1)+1); ans.yy=min(ans.yy,a.yy+b.xy+dis(y[mid],mid+1,mid+1,x[mid+1])+1); ans.yy=min(ans.yy,a.yy+b.yy+dis(y[mid],mid+1,y[mid+1],mid+1)+1); return ans; } template<int maxn>struct SMT{ node tr[maxn]; void pushup(int pos,int nl,int nr){ int mid=(nl+nr)>>1; tr[pos]=merge(tr[pos<<1],tr[pos<<1|1],mid); } void build(int pos,int nl,int nr,int x[],int y[]){ if(nl==nr){ tr[pos]=(node){0,dis(nl,x[nl],y[nl],nl),dis(y[nl],nl,nl,x[nl]),0}; return; } int mid=(nl+nr)>>1; build(pos<<1,nl,mid,x,y),build(pos<<1|1,mid+1,nr,x,y),pushup(pos,nl,nr); } void add(int pos,int nl,int nr,int a,int b,int c){ if(nl==nr){ x[a]=b,y[a]=c,tr[pos]=(node){0,dis(nl,x[nl],y[nl],nl),dis(y[nl],nl,nl,x[nl]),0}; return; } int mid=(nl+nr)>>1; if(a<=mid)add(pos<<1,nl,mid,a,b,c); if(a>mid)add(pos<<1|1,mid+1,nr,a,b,c); pushup(pos,nl,nr); } node query(int pos,int nl,int nr,int gl,int gr){ if(gl<=nl&&nr<=gr)return tr[pos]; int mid=(nl+nr)>>1; if(gl<=mid&&gr>mid)return merge(query(pos<<1,nl,mid,gl,gr),query(pos<<1|1,mid+1,nr,gl,gr),mid); else{ if(gl<=mid)return query(pos<<1,nl,mid,gl,gr); if(gr>mid)return query(pos<<1|1,mid+1,nr,gl,gr); } } }; SMT<800005>t; int main(){ cin>>n>>m; for(int i=1;i<n;i++)cin>>x[i]>>y[i]; t.build(1,1,n-1,x,y); for(int i=1,opt,a,b,c,d;i<=m;i++){ cin>>opt; if(opt==1)cin>>a>>b>>c,t.add(1,1,n-1,a,b,c); else{ cin>>a>>b>>c>>d; if(max(a,b)==max(c,d)){ cout<<dis(a,b,c,d)<<'\n'; continue; } if(max(a,b)>max(c,d))swap(a,c),swap(b,d); int l=max(a,b),r=max(c,d)-1; node ans=t.query(1,1,n,l,r); cout<<min(min(dis(a,b,l,x[l])+dis(r+1,x[r],c,d)+ans.xx+1,dis(a,b,l,x[l])+dis(y[r],r+1,c,d)+ans.xy+1),min(dis(a,b,y[l],l)+dis(r+1,x[r],c,d)+ans.yx+1,dis(a,b,y[l],l)+dis(y[r],r+1,c,d)+ans.yy+1))<<'\n'; } } return 0; }