反复看了好多遍也没看出是哪里错了,求助,第一个样例过了,第二个没过。
#include<bits/stdc++.h>
using namespace std;
long long n,m,s,tot,R1,R2,dis[1000005],vis[1000005];
vector<pair<long long,long long> >to[1000005];
struct Seg{
int ls,rs;
#define ls(o) c[o].ls
#define rs(o) c[o].rs
#define mid ((l+r)/2)
}c[1000005];
priority_queue<pair<long long,long long>,vector<pair<long long,long long> >,greater<pair<long long,long long> > >que;
void Forward(int o,int l,int r,int v,int L,int R,long long w){
if(l>=L&&r<=R){
to[v].push_back(make_pair(o,w));
return;
}
if(L<=mid){
if(ls(o)==0){
ls(o)=++tot;
to[o].push_back(make_pair(ls(o),0));
if(l>=mid)
to[ls(o)].push_back(make_pair(l,0));
}
Forward(ls(o),l,mid,v,L,R,w);
}
if(R>mid){
if(rs(o)==0){
rs(o)=++tot;
to[o].push_back(make_pair(rs(o),0));
if(mid+1>=r)
to[rs(o)].push_back(make_pair(r,0));
}
Forward(rs(o),mid+1,r,v,L,R,w);
}
}
void Backward(int o,int l,int r,int v,int L,int R,long long w){
if(l>=L&&r<=R){
to[o].push_back(make_pair(v,w));
return;
}
if(L<=mid){
if(ls(o)==0){
ls(o)=++tot;
to[ls(o)].push_back(make_pair(o,0));
if(l>=mid)
to[l].push_back(make_pair(ls(o),0));
}
Backward(ls(o),l,mid,v,L,R,w);
}
if(R>mid){
if(rs(o)==0){
rs(o)=++tot;
to[rs(o)].push_back(make_pair(o,0));
if(mid+1>=r)
to[r].push_back(make_pair(rs(o),0));
}
Backward(rs(o),mid+1,r,v,L,R,w);
}
}
int main(){
scanf("%lld%lld%lld",&n,&m,&s);
tot=n;
for(int i=1,typ,s,u,v,w;i<=m;i++){
scanf("%d",&typ);
if(typ==1){
scanf("%d%d%d",&u,&v,&w);
to[u].push_back(make_pair(v,w));
}
if(typ==2){
scanf("%d%d%d%d",&s,&u,&v,&w);
if(R1==0)
R1=++tot;
Forward(R1,1,n,s,u,v,w);
}
if(typ==3){
scanf("%d%d%d%d",&s,&u,&v,&w);
if(R2==0)
R2=++tot;
Backward(R2,1,n,s,u,v,w);
}
}
memset(dis,6,sizeof(dis));
dis[s]=0;
que.push(make_pair(0,s));
while(!que.empty()){
while(!que.empty()&&vis[que.top().second])
que.pop();
if(que.empty())
break;
long long cur=que.top().second;
vis[cur]=1;
for(int i=0;i<to[cur].size();i++)
if(!vis[to[cur][i].first]&&dis[to[cur][i].first]>dis[cur]+to[cur][i].second){
dis[to[cur][i].first]=dis[cur]+to[cur][i].second;
que.push(make_pair(dis[to[cur][i].first],to[cur][i].first));
}
}
for(int i=1;i<=n;i++){
if(dis[i]>=1e16)
printf("-1 ");
else printf("%lld ",dis[i]);
}
}/*
*/