马蜂不好见谅
#include<bits/stdc++.h>
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
using namespace std;
const int N=4e5+10;
struct ll{
int x,w;
bool operator<(const ll &a)const{
return w>a.w;
}
};
vector<ll>v[1000010];
int dis[N<<1],t[N],t2[N],a[N],n,m,op,pos,s,w;
bool f[N<<1];
void build(int l,int r,int fa){
if(l==r){
a[l]=fa;
v[a[l]+N].push_back({a[l],0});
return;
}
v[fa].push_back({ls(fa),0});
v[fa].push_back({rs(fa),0});
v[ls(fa)+N].push_back({fa+N,0});
v[rs(fa)+N].push_back({fa+N,0});
int mid=(l+r)>>1;
build(l,mid,ls(fa));
build(mid+1,r,rs(fa));
return;
}
void add(int l,int r,int L,int R,int fa){
if(L>=l&&R<=r){
// cout<<L<<' '<<R<<' '<<fa<<'\n';
if(op==2)v[pos+N].push_back({fa,w});
else v[fa+N].push_back({pos,w});
return;
}
int mid=(L+R)>>1;
if(l<=mid)add(l,r,L,mid,ls(fa));
if(r>mid)add(l,r,mid+1,R,rs(fa));
return;
}
void dijkstra(){
priority_queue<ll>q;
memset(dis,0x3f,sizeof(dis));
dis[a[s]+N]=0;
q.push({a[s]+N,0});
while(!q.empty()){
ll tmp=q.top();
// cout<<tmp.x<<' '<<tmp.w<<endl;
q.pop();
if(f[tmp.x])continue;
f[tmp.x]=true;
for(ll i:v[tmp.x]){
if(dis[i.x]>dis[tmp.x]+i.w){
dis[i.x]=dis[tmp.x]+i.w;
q.push({i.x,dis[i.x]});
}
}
}
}
int main(){
cin>>n>>m>>s;
build(1,n,1);
// for(int i=1;i<=n;i++){
// cout<<a[i]<<' ';
// }
// cout<<endl;
for(int i=1;i<=m;i++){
int l,r;
cin>>op>>pos>>l>>r;
if(op==1){
v[a[pos]+N].push_back({a[l]+N,r});
}else{
cin>>w;
add(l,r,1,n,1);
}
}
// for(int i=1;i<=n*2;i++){
// for(ll j:v[i]){
// cout<<"{"<<j.x<<","<<j.w<<"} ";
// }
// cout<<endl;
// }
// for(int i=1;i<=n*2;i++){
// for(ll j:v[i+N]){
// cout<<"{"<<j.x<<","<<j.w<<"} ";
// }
// cout<<endl;
// }
dijkstra();
for(int i=1;i<=n;i++){
if(dis[a[i]]>1e9)cout<<-1<<' ';
else cout<<dis[a[i]]<<' ';
}
cout<<endl;
return 0;
}