rt,不明原因RE,求调
#include <bits/stdc++.h>
using namespace std;
inline long long read() {
long long x;bool f;char ch;
for(f=0;!isdigit(ch=getchar());f=ch=='-');
for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
return f?-x:x;
}
inline void print(long long x,char las) {
if(!x) {
putchar(48),putchar(las);
return ;
}
if(x<0) putchar('-'),x=-x;
int ls[20],k=0;
while(x) ls[++k]=x%10,x/=10;
while(k) putchar(ls[k--]+48);
putchar(las);
return ;
}
#define jump 400000
struct node {
int ls,rs;
}nd[800001];
struct edge {
int to;long long len;
edge *next;
}*head[800001],rd[1000001];int rs;
inline void add(int u,int v,long long len) {
rd[rs].to=v;rd[rs].len=len;rd[rs].next=head[u];head[u]=&rd[rs++];
return ;
}
int n=read(),q=read(),s=read(),ss,leaf[400001];
inline void build(int x,int l,int r) {
x=++ss;
if(l==r) {
leaf[l]=x;
add(x,x+jump,0);
add(x+jump,x,0);
return ;
}
int mid=(l+r)>>1;
nd[x].ls=ss+1;
add(x,ss+1,0);
add(ss+1+jump,x+jump,0);
build(x,l,mid);
nd[x].rs=ss+1;
add(x,ss+1,0);
add(ss+1+jump,x+jump,0);
build(x,mid+1,r);
return ;
}
inline void link(int x,int l,int r,int L,int R,int u,int len,bool job) {
if(l>R || r<L) return ;
if(l>=L && r<=R) {
if(job) add(x+jump,u,len);
else add(u,x,len);
return ;
}
int mid=(l+r)>>1;
link(nd[x].ls,l,mid,L,R,u,len,job);
link(nd[x].rs,mid+1,r,L,R,u,len,job);
return ;
}
struct dot {
long long dist=0x3f3f3f3f3f3f3f3f;int name;
inline bool operator<(const dot&ls) const {
return dist>ls.dist;
}
}bot[800001];
priority_queue<dot>que;
int main() {
build(0,1,n);
for(int i=1;i<=q;i++) {
int opt=read();
if(opt==1) {
int u=read(),v=read(),len=read();
add(leaf[u],leaf[v],len);
}else {
int u=read(),l=read(),r=read(),len=read();
link(1,1,n,l,r,leaf[u],len,opt%2);
}
}
bot[leaf[s]].dist=0;bot[leaf[s]].name=leaf[s];que.push(bot[leaf[s]]);
while(!que.empty()) {
dot now=que.top();que.pop();
if(now.dist>bot[now.name].dist) continue;
for(edge *i=head[now.name];i;i=i->next) {
int nex=i->to;
if(bot[nex].dist>now.dist+i->len) {
bot[nex].dist=now.dist+i->len;
bot[nex].name=nex;
que.push(bot[nex]);
}
}
}
for(int i=1;i<=n;i++) print(bot[leaf[i]].dist==0x3f3f3f3f3f3f3f3f ? -1 : bot[leaf[i]].dist,' ');
return 0;
}