rt,一直 T 第八个点。
是哪里写假了吗(
#include <bits/stdc++.h>
using namespace std;
const int N=200100,M=3000100,D=800100;
typedef long long ll;
#define inf 0x3f3f3f3f3f3f3f3f
int to[M],nxt[M],head[M];
int idx=1,n,m,s,in1,in2,in3,in4,in5;
int id[M];ll dis[M],w[M];
struct node{int x;ll dis;};
bool operator < (node a,node b){return a.dis<b.dis;}
priority_queue <node> q;
void add(int u,int v,int c){idx++;to[idx]=v;nxt[idx]=head[u];head[u]=idx;w[idx]=c;}
struct STn{int l,r;};
struct ST{
STn a[N<<2];
void build(int p,int l,int r){
a[p].l=l;a[p].r=r;
if(a[p].l==a[p].r){id[a[p].l]=p;return ;}
add(p,(p<<1),0);add(p,(p<<1|1),0);
add((p<<1)+D,p+D,0);add((p<<1|1)+D,p+D,0);
int mid=(a[p].l+a[p].r)>>1;
build(p<<1,l,mid);build(p<<1|1,mid+1,r);
}
void connect(int p,int l,int r,int v,int c,int f){
if(l<=a[p].l&&a[p].r<=r){if(f) add(v,p,c);else add(p+D,v+D,c);return ;}
int mid=(a[p].l+a[p].r)>>1;
if(l<=mid) connect(p<<1,l,r,v,c,f);
if(r>mid) connect(p<<1|1,l,r,v,c,f);
}
}tree;
void Dijkstra(){
memset(dis,0x3f,sizeof dis);
q.push(node{id[s]+D,0});dis[id[s]+D]=0;
while(!q.empty()){
node now=q.top();q.pop();
if(dis[now.x]<now.dis) continue;
for(int i=head[now.x];i;i=nxt[i]){
int v=to[i];
if(dis[v]<=dis[now.x]+w[i]) continue;
dis[v]=dis[now.x]+w[i];
q.push(node{v,dis[v]});
}
}
}
int main(){
// freopen("the.in","r",stdin);
// freopen("the.out","w",stdout);
scanf("%d%d%d",&n,&m,&s);
tree.build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&in1,&in2,&in3,&in4);
if(in1==1) add(id[in2],id[in3],in4);
else scanf("%d",&in5),tree.connect(1,in3,in4,id[in2],in5,(in1==2)?1:0);
}
for(int i=1;i<=n;i++) add(id[i],id[i]+D,0),add(id[i]+D,id[i],0);
Dijkstra();
for(int i=1;i<=n;i++){
if(dis[id[i]]==inf) cout<<"-1 ";
else cout<<dis[id[i]]<<' ';
}
return 0;
}