1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include<cstdio> #include<cstring> #include<queue> using namespace std; template<typename T> void read(T &x){ x=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return; } template<typename T,typename...Args> void read(T &x,Args &...args){ read(x); read(args...); return; } typedef long long ll; const int N=1e5+10; #define ls (u<<1) #define rs (u<<1|1) #define K 4e5 #define inf 4557430888798830399 int n,q,s,a[N],tot_edge,head[N*8]; struct edge{ int to,nxt,w; }e[N*50]; void add_edge(int u,int v,int w){ e[++tot_edge].to=v; e[tot_edge].nxt=head[u]; e[tot_edge].w=w; head[u]=tot_edge; return; } void build(int u,int l,int r){ if(l==r){ a[l]=u; return; } add_edge(u,ls,0),add_edge(u,rs,0); add_edge(ls+K,u+K,0),add_edge(rs+K,u+K,0); int mid=(l+r)/2; build(ls,l,mid); build(rs,mid+1,r); return; } void modify(int u,int l,int r,int x,int y,int v,int w,bool rev){ if(x<=l&&y>=r){ if(rev) add_edge(v+K,u,w); else add_edge(u+K,v,w); return; } int mid=(l+r)/2; if(x<=mid) modify(ls,l,mid,x,y,v,w,rev); if(y>mid) modify(rs,mid+1,r,x,y,v,w,rev); return; } priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> que; bool vis[N*8]; ll dis[N*8]; signed main(){ memset(dis,0x3f,sizeof(dis)); read(n,q,s); build(1,1,n); for(int i=1;i<=n;i++) add_edge(a[i],a[i]+K,0),add_edge(a[i]+K,a[i],0); for(int i=1,opt,x,y,v,w;i<=q;i++){ read(opt); if(opt==1){ read(x,y,w); add_edge(a[x]+K,a[y],w); } else if(opt==2){ read(v,x,y,w); modify(1,1,n,x,y,a[v],w,1); } else{ read(v,x,y,w); modify(1,1,n,x,y,a[v],w,0); } } dis[(int)(a[s]+K)]=0; que.push(make_pair(0,a[s]+K)); while(!que.empty()){ int u=que.top().second; que.pop(); if(vis[u]) continue; vis[u]=1; for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to,w=e[i].w; if(dis[v]>dis[u]+w){ dis[v]=dis[u]+w; que.push(make_pair(dis[v],v)); } } } for(int i=1;i<=n;i++){ if(dis[a[i]]==inf) printf("-1 "); else printf("%lld ",dis[a[i]]); } return 0; }
|