样例没过,输出0 29 12,求调
#include <bits/stdc++.h>
using namespace std;
#define min(a,b) ((a)>(b)?(b):(a))
#define max(a,b) ((a)<(b)?(b):(a))
#define INF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define sc scanf
#define pr printf
#define v1 first
#define v2 second
#define f(nm1,nm2,nm3) for(int nm1=nm2; nm1<= nm3; nm1++)
#define lowbit(x) (x&(-x))
#define int long long
#define lson k*2,l,mid
#define rson k*2+1,mid+1,r
int n,q,s;
const int sz=1e5+5;
const int len=4e5+5;
vector<pair<int,int>> v[sz*9];
unordered_map<int,int> mp;
void build(int k,int l,int r)
{
if(l==r)
{
mp[l]=k;
v[k].push_back({k+len,0});
v[k+len].push_back({k,0});
return;
}
v[k].push_back({k*2,0});
v[k].push_back({k*2+1,0});
v[k*2+len].push_back({k+len,0});
v[k*2+1+len].push_back({k+len,0});
int mid=(l+r)>>1;
build(lson);
build(rson);
}
void add1(int x,int y,int w)
{
v[mp[x]].push_back({mp[y],w});
}
int nowl,nowr;
void add2(int k,int l,int r,int x,int w)
{
if(nowl<=l&&r<=nowr)
{
v[mp[x]+len].push_back({k,w});
return;
}
int mid=(l+r)>>1;
if(mid>=nowl)
{
add2(lson,x,w);
}
if(mid<nowr)
{
add2(rson,x,w);
}
}
void add3(int k,int l,int r,int x,int w)
{
if(nowl<=l&&r<=nowr)
{
v[k+len].push_back({mp[x],w});
return;
}
int mid=(l+r)>>1;
if(mid>=nowl)
{
add3(lson,x,w);
}
if(mid<nowr)
{
add3(rson,x,w);
}
}
bool b[sz*9];
int dis[sz*9];
void dijkstra()
{
memset(dis,INF,sizeof(dis));
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
b[mp[s]]=1;
dis[mp[s]]=0;
q.push({0,mp[s]});
while(!q.empty())
{
int nm=q.top().v2;
q.pop();
for(int i=0; i < v[nm].size(); i++)
{
int xx=v[nm][i].v1;
int w=v[nm][i].v2;
if(!b[xx]&&w+dis[nm]<dis[xx])
{
b[xx]=1;
dis[xx]=w+dis[nm];
q.push({dis[xx],xx});
}
}
}
}
signed main()
{
sc("%lld%lld%lld",&n,&q,&s);
build(1,1,n);
while(q--)
{
int op;
sc("%lld",&op);
if(op==1)
{
int x,y,w;
sc("%lld%lld%lld",&x,&y,&w);
add1(x,y,w);
}
else if(op==2)
{
int x,w;
sc("%lld%lld%lld%lld",&x,&nowl,&nowr,&w);
add2(1,1,n,x,w);
}
else
{
int x,w;
sc("%lld%lld%lld%lld",&x,&nowl,&nowr,&w);
add3(1,1,n,x,w);
}
}
dijkstra();
for(int i=1; i <= n; i++)
{
int res=min(dis[mp[i]+len],dis[mp[i]]);
pr("%lld ",(res==INF)?(-1ll):res);
}
return 0;
}