#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,q,s;
bool flg=0;
#define X first
#define Y second
struct segtree{
struct node{ll tg,mx,mn;}tr[100010<<2];
#define ls p<<1
#define rs p<<1|1
#define mid (l+r>>1)
segtree(){memset(tr,0x3f,sizeof(tr));}
void pushup(int p){tr[p].mx=max(tr[ls].mx,tr[rs].mx);tr[p].mn=min(tr[ls].mn,tr[rs].mn);}
void pushdown(int p){
if(tr[p].tg!=0x3f3f3f3f3f3f3f3fll){
tr[ls].mx=tr[ls].mn=tr[ls].tg=tr[p].tg;
tr[rs].mx=tr[rs].mn=tr[rs].tg=tr[p].tg;
tr[p].tg=0x3f3f3f3f3f3f3f3fll;
}
}
void modi(int p,int l,int r,int L,int R,ll v){
if(tr[p].mx<=v)return;
if(L<=l&&R>=r){
if(tr[p].mn>=v){tr[p].tg=v,tr[p].mx=tr[p].mn=v;flg=1;return;}
}
pushdown(p);
if(L<=mid)modi(ls,l,mid,L,R,v);
if(R>mid)modi(rs,mid+1,r,L,R,v);
pushup(p);
}
ll qry(int p,int l,int r,int L,int R){
if(L<=l&&R>=r)return tr[p].mn;
ll ans=5e18;
pushdown(p);
if(L<=mid)ans=qry(ls,l,mid,L,R);
if(R>mid)ans=min(ans,qry(rs,mid+1,r,L,R));
pushup(p);
return ans;
}
}t;
vector<pair<int,pair<int,int>>>g[100010],g1[100010];
void write(ll v){cout<<(v>1e18?-1:v);}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>q>>s;
while(q--){
int op,l,r,u,v,w;cin>>op;
if(op==1)cin>>u>>v>>w,g[u].push_back({w,{v,v}});
else if(op==2)cin>>u>>l>>r>>w,g[u].push_back({w,{l,r}});
else if(op==3)cin>>v>>l>>r>>w,g1[v].push_back({w,{l,r}});
}
for(int i=1;i<=n;++i)sort(g[i].begin(),g[i].end());
t.modi(1,1,n,s,s,0);
for(int _=1;_<=n;++_){
flg=0;
for(int i=1;i<=n;++i){
const ll v=t.qry(1,1,n,i,i);
for(auto k:g1[i])t.modi(1,1,n,i,i,t.qry(1,1,n,k.Y.X,k.Y.Y)+k.X);
for(auto k:g[i])t.modi(1,1,n,k.Y.X,k.Y.Y,v+k.X);
}
if(!flg)break;
}
write(t.qry(1,1,n,1,1));
for(int i=2;i<=n;++i)cout<<' ',write(t.qry(1,1,n,i,i));
// cerr<<clock()*1000/CLOCKS_PER_SEC<<endl;
return 0;
}
通过了CF数据。