一直RE 据说要加离散化
#include <bits/stdc++.h>
#define int long long
#define mod 1000000007
#define P pair<long long, int>
#define oo 0x7fffffff
using namespace std;
int read()
{
int x = 0;
char c = getchar();
while(c < '0' || c > '9')
c = getchar();
while(c >= '0' && c <= '9')
{
x = x * 10 + c - '0';
c = getchar();
}
return x;
}
int n, m, s, rt1, rt2, nn, tot, head[100005];
int rs[6000005], ls[6000005];
struct edge
{
int v, w, nxt;
}e[6000005];
void add(int u, int v, int w)
{
e[++tot].v = v;
e[tot].w = w;
e[tot].nxt = head[u];
head[u] = tot;
}
void buildin(int &rt, int l, int r)
{
if(l == r)
{
rt = l;
return;
}
rt = ++nn;
int mid = (l + r) >> 1;
buildin(ls[rt], l, mid);
buildin(rs[rt], mid+1, r);
add(ls[rt], rt, 0);
add(rs[rt], rt, 0);
}
void buildout(int &rt, int l, int r)
{
if(l == r)
{
rt = l;
return;
}
rt = ++nn;
int mid = (l + r) >> 1;
buildout(ls[rt], l, mid);
buildout(rs[rt], mid+1, r);
add(rt, ls[rt], 0);
add(rt, rs[rt], 0);
}
int ll, rr;
void update(int rt, int l, int r, int v, int w, int type)
{
if(ll <= l and r <= rr)
{
if(type == 2)
add(v, rt, w);
else
add(rt, v, w);
return;
}
int mid = (l + r) >> 1;
if(ll <= mid)
update(ls[rt], l, mid, v, w, type);
if(rr > mid)
update(rs[rt], mid+1, r, v, w, type);
}
priority_queue<P, vector<P>, greater<P> > q;
int dis[300005];
bool vis[300005];
int ans, sum;
void dij(int s)
{
for(int i = 0; i <= n; i++)
dis[i] = oo;
dis[s] = 0;
q.push(make_pair(0, s));
while(!q.empty())
{
int cur = q.top().second;
q.pop();
if(vis[cur])
continue;
vis[cur] = 1;
for(int i = head[cur]; i; i = e[i].nxt)
{
int v = e[i].v;
dis[v] = min(dis[v], dis[cur] + e[i].w);
q.push(make_pair(dis[v], v));
}
}
for(int i = 1; i <= n; i++)
{
if(dis[i] == oo)
cout << -1 << ' ';
else
cout << dis[i] << ' ';
}
}
signed main()
{
n = read(), m = read(), s = read();
nn = n;
buildin(rt1, 1, n);
buildout(rt2, 1, n);
for(int i = 1; i <= m; i++)
{
int type, u, v, l, r, w;
type = read();
if(type == 1)
{
u = read(), v = read(), w = read();
add(u, v, w);
}
else if(type == 2)
{
v = read(), ll = read(), rr = read(), w = read();
update(rt2, 1, n, v, w, type);
}
else
{
v = read(), ll = read(), rr = read(), w = read();
update(rt1, 1, n, v, w, type);
}
}
dij(s);
cout << sum << ' ' << ans;
return 0;
}