码风复古(?我同学评价的
#4 号点该输出 -1 的输出了一个较大的值。
#include<bits/stdc++.h>
#define int long long
#define int08 508032
#define inf (0x3f3f3f3f3f3f3f3f)
using namespace std;
struct edge{
int v,w;
};
struct tree{
int l,r;
}t[1919810];
vector<edge> e[916414];
int p[114514],n;
void connect(int u,int v,int w)
{
e[u].push_back({v,w});
}
void build(int l,int r,int o)
{
t[o].l=l;t[o].r=r;
if(l==r)
{
p[l]=o;
return;
}
int mid=(l+r)>>1;
build(mid+1,r,o*2+1);
build(l,mid,o*2);
connect(o,o*2,0);
connect(o,o*2+1,0);
connect(o*2+1+int08,o+int08,0);
connect(o*2+int08,o+int08,0);
}
void change(int l,int r,int o,int w,int op,int u)
{
if(l>=t[o].l&&r<=t[o].r)
{
if(op==2) connect(p[u],o,w);
else connect(o+int08,p[u],w);
return;
}
int mid=(t[o].l+t[o].r)>>1;
if(r>mid) change(mid+1,r,o*2+1,w,op,u);
if(l<=mid) change(l,mid,o*2,w,op,u);
}
priority_queue <pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
int k,dis[1616414],vis[1616414],q,s,i,j,v,l,r,w,op;
void dijkstra(int s)
{
pq.push({0,s});
while(!pq.empty())
{
int du=pq.top().first,u=pq.top().second;
pq.pop();
if(vis[u]) continue;
dis[u]=du;vis[u]=1;
for(auto v:e[u])
{
pq.push({dis[u]+v.w,v.v});
}
}
}
signed main()
{
cin>>n>>q>>s;
build(1,n,1);
for(i=1;i<=n;i++)
connect(p[i],p[i]+int08,0),connect(p[i]+int08,p[i],0);
for(j=1;j<=q;j++)
{
cin>>op>>v>>l;
if(op>1) cin>>r;
cin>>w;
if(op>1)
change(l,r,1,w,op,v);
else connect(p[v]+int08,p[l],w);
}
for(i=1;i<=2*int08;i++) dis[i]=inf;
dis[p[s]]=0;
dijkstra(p[s]);
for(i=1;i<=n;i++)
cout<<((dis[p[i]]==inf)?(-1):(dis[p[i]]))<<" ";
return 0;
}