#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #include<cmath> #include<algorithm> #include<queue> using namespace std; typedef long long ll; typedef pair<ll,ll> pii; #define FILE "read" #define MAXN (ll)2e6+10 struct node{ll y,next,v;}e[MAXN]; ll n,m,S,cnt,len,root[5],Link[MAXN],dis[MAXN],vis[MAXN],tr[MAXN][2]; priority_queue<pii,vector<pii >,greater<pii> > q; inline ll read(){ ll x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();} return x*f; } void insert(ll x,ll y,ll v){e[++len].next=Link[x];Link[x]=len;e[len].y=y;e[len].v=v;} void build(ll &p,ll l,ll r,ll opt){ if(l==r) {p=l; return;} p=++cnt; ll mid=(l+r)>>1; build(tr[p][0],l,mid,opt); build(tr[p][1],mid+1,r,opt); if(!opt) insert(p,tr[p][0],0),insert(p,tr[p][1],0); else insert(tr[p][0],p,0),insert(tr[p][1],p,0); } void updata(ll p,ll l,ll r,ll x,ll y,ll pos,ll v,ll opt){ if(x>r||y<l) return; if(x<=l&&y>=r){ if(opt==2) insert(pos,p,v); else insert(p,pos,v); return; } ll mid=(l+r)>>1; updata(tr[p][0],l,mid,x,y,pos,v,opt); updata(tr[p][1],mid+1,r,x,y,pos,v,opt); } void dijkstra(){ memset(dis,10,sizeof(dis)); ll oo=dis[0]; dis[S]=0; vis[S]=1; q.push(make_pair(dis[S],S)); while(!q.empty()){ ll v=q.top().first,x=q.top().second; q.pop(); for(ll i=Link[x];i;i=e[i].next)if(dis[x]+e[i].v<dis[e[i].y]){ dis[e[i].y]=dis[x]+e[i].v; if(!vis[e[i].y]) q.push(make_pair(dis[e[i].y],e[i].y)); } vis[x]=0; } for(ll i=1;i<=n;++i){ if(dis[i]==oo) printf("-1 "); else printf("%I64d ",dis[i]); } } int main(){ n=cnt=read(); m=read(); S=read(); build(root[1],1,n,0); build(root[2],1,n,1); for(ll i=1;i<=m;++i){ ll opt=read(); if(opt==1) {ll x=read(),y=read(),v=read();insert(x,y,v);} else {ll x=read(),l=read(),r=read(),v=read();updata(root[opt-1],1,n,l,r,x,v,opt);} } dijkstra(); return 0; }
|