제출 #1268769

#제출 시각아이디문제언어결과실행 시간메모리
1268769amnRobot (JOI21_ho_t4)C++20
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include<tuple>
using namespace std;
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define fastio() ios::sync_with_stdio(false);cin.tie(nullptr);
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define pll pair<ll,ll>
#define pb push_back
#define fi first
#define se second
#define ll long long
#define lld double
#define sz(a) (ll)(a.size())
#define cy cout<<"YES"<<endl
#define cn cout<<"NO"<<endl
#define endl '\n'
const long long LINF = 1e18;
const ll MOD = 1e9+7;  
#ifndef ONLINE_JUDGE
#define debug(x) cerr << #x << '=';_print(x);cerr << endl;
#else
#define debug(x)
#endif
void _print(int x) { cerr << x; }
void _print(long long x) { cerr << x; }
void _print(double x) { cerr << x; }
void _print(char x) { cerr << x; }
void _print(const string &x) { cerr << x; }
void _print(bool x) { cerr << (x ? '1' : '0'); }
void _print(pair<ll,ll> p) { cerr << '{' ;_print(p.first);cerr<<' ';_print(p.second);cerr<<'}'; }
template <typename T>
void _print(const vector<T> &v)
{cerr << '[';for (const auto &i : v){_print(i);cerr << ' ';}cerr << ']';}
template <typename T>
void _print(const multiset<T> &s){cerr << '{';for (const auto &i : s){_print(i);cerr << ' ';}cerr << '}';}
template <typename T>
void _print(const set<T> &s){cerr << '{';for (const auto &i : s){_print(i);cerr << ' ';}cerr << '}';}
template <typename K, typename V>
void _print(const map<K, V> &m){cerr << '{'<<endl;for (const auto &p : m){cerr << '(';_print(p.first);cerr << ':';_print(p.second);cerr << ')';}cerr << endl<<'}';}
template <typename T1, typename T2>
void _print(const pair<T1, T2> &p){cerr << '(';_print(p.first);cerr << ',';_print(p.second);cerr << ')';}
ll mod_add(ll&a,ll&b,ll m) {return (a+b)%m;}
ll mod_mul(ll&a,ll&b, ll m) {return (a*b)%m;}
ll mod_sub(ll&a,ll&b,ll m) {return ((a-b)%m+m)%m;}
ll gcd(ll a,ll b) {if(b==0) return a;return gcd(b,a%b);}
ll lcm(ll a,ll b) {return a*b/gcd(a,b);}
ll binExpo(ll a,ll n) {ll res=1;while(n) {if(n&1) {res=(res*a);}a=(a*a); n>>=1;}return res;}
ll N=3*1e5;
ll binExpom(ll a,ll n) {ll res=1;while(n) {if(n&1) {res=(res*a); res%=MOD;}a=(a*a); a%=MOD; n>>=1;}return res;}
ll modInv(ll a,ll mod) {return binExpom(a,mod-2);}
vector<ll>fact(N+2,0);
void calcFact() {fact[0]=1;fact[1]=1;for(ll i=2;i<=N;i++){fact[i]=mod_mul(fact[i-1],i,MOD);}}
ll ncr(ll n,ll r)
 {ll numr=fact[n];ll den=mod_mul(fact[n-r],fact[r],MOD);ll ans=(modInv(den,MOD)*numr)%MOD;return ans;}
vector<ll> sieve(ll N) {vector<ll>primes(N+1,1);primes[0]=primes[1]=0;for(int i=2;i*i<=N;i++) {for
(int j=i*i;j<=N;j+=i) {primes[j]=0;}}return primes;}
ll extEuclid(ll a,ll b,ll&x ,ll& y) {
if(b==0) {x=1;y=0;return a;}ll x1,y1;ll d=extEuclid(b,a%b,x1,y1);x=y1;y=x1-y1*(a/b);return d;}
vector<ll> findLps(string &s)
{vector<ll> lps(sz(s) + 1, 0);
ll len = 0;ll i = 1;ll n = sz(s);while (i < n){if (s[i] == s[len]){len++;lps[i] = len;i++;}else{if (len != 0){len = lps[len - 1];}else{len = 0;lps[i] = 0;i++;}}}return lps;}
vector<ll> calcZarray(string &s)
{ll n = sz(s);vector<ll> z(n + 1, 0);ll l = 0;ll r = 0;ll i = 1;while (i < n){
if (i < r){if (z[i - l] < r - l + 1){z[i] = z[i - l];}else{l = i;while (r < n and s[r] == s[r - l])r++;z[i] = r - l;r--;i++;}}else{l = i;r = i;while (r < n and s[r - l] == s[r]){r++;}z[i] = r - l;r--;i++;}}return z;}
vector<ll> segSieve(ll l, ll r, ll n){
vector<ll> prime = sieve(n);vector<ll> rangePrime(n + 1, 1);for (int i = 2; i * i <= r; i++){if (prime[i] == 1){int j = (l / i) * i;if (j < l){j += i;}j = max(i * i, j);for (int init = j - l; init < n; init += i){rangePrime[init] = 0;}}}return rangePrime;}
// /
void rabin_karp(string const& s, string const& t) {
auto f=[&](string str)-> ll{ll ht=0;for(int i=0;i<sz(str);i++) {ht=(ht*31 + str[i]-'a'+1)%MOD;}return ht;};ll h=0;ll n=sz(s);debug(n);vector<ll>ph(n+1,0);for(int i=0;i<n;i++) {ll dig=s[i]-'a'+1;h=(h*31LL+dig)%MOD;ph[i]=h;}ll cnt=0;ll ht=f(t);if(ph[sz(t)-1]==ht) cnt++;ll ws=sz(t);ll sub=binExpo(31,ws);for(int i=1;i<=n-ws;i++) {ll currH=ph[i+ws-1];currH=((currH-ph[i-1]*sub)%MOD + MOD)%MOD;if(currH==ht) cnt++;}}
/*<------------------------------------------------------------------------>*/
void binaryLifting(ll src,ll parent,vector<vector<ll>>&adj,vector<vector<ll>>&dp,vector<ll>&lvl,ll curr) {
    lvl[src]=curr;
    dp[src][0]=parent;
    debug(src)
    for(int i=1;i<=19;i++) {
        dp[src][i]=dp[dp[src][i-1]][i-1];
    }

    for(auto nbr:adj[src]) {
        if(nbr==parent) continue;

        binaryLifting(nbr,src,adj,dp,lvl,curr+1);

    }
}

vector<vector<ll>> buildSparseTable(ll n,vector<ll>&a) {
    vector<vector<ll>>st(20,vector<ll>(n+2,0));

    n=a.size();
    for(int i=0;i<n;i++) {
        st[0][i]=a[i];
    }
    for(int i=1;(1<<i)<=n;i++) {
        for(int j=0;j+(1<<i)<=n;j++) {
            st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
            // st[i][j]=gcd(st[i-1][j],st[i-1][j+(1<<(i-1))]);
        }
    }
    return st;

}
vector<ll> logTable(ll n) {
    vector<ll>lg(n+2,0);
    lg[1]=0;
    for(int i=2;i<=n;i++) {
        lg[i]=lg[i/2]+1;
    }
    return lg;
}
class SegTree {
private:
    vector<ll>seg;
    ll size;
public:
    SegTree(ll n) {
        // this->size=n;
        seg.resize(4*n+1,0);
    }
    void build(ll src,ll tl,ll tr,vector<ll>&a) {
        if(tl>tr) return;
        if(tl==tr) {
            seg[src]= a[tl];
            // seg[src]=vector<ll>(1,a[tl]);
            return;
        }
        ll tm=tl+(tr-tl)/2;
        build(2*src+1,tl,tm,a);
        build(2*src+2,tm+1,tr,a);
        seg[src]=(seg[2*src+1]+seg[2*src+2]);
        // seg[src]=max(seg[2*src+1],seg[2*src+2]);
        // merge(all(seg[2*src+1]),all(seg[2*src+2]),seg[src].begin());

    }
    void update(ll src,ll tl,ll tr,ll& pos,ll &val) {
        if(tl>tr) return;
        if(tl==tr) {
            seg[src]=val;
            return;
        }

        ll tm=tl+(tr-tl)/2;
        if(pos<=tm) {
            update(2*src+1,tl,tm,pos,val);
        }else {
            update(2*src+2,tm+1,tr,pos,val);
        }
        // seg[src]=max(seg[2*src+1],seg[2*src+2]);
        seg[src]=(seg[2*src+1]+seg[2*src+2]);
        // seg[src]=merge(seg[2*src+1],seg[2*src+2]);

    }
    ll findmn(ll src,ll tl,ll tr,ll k) {
        if(tl==tr) {
            return tl;
        }
        ll ans=1e6;
        ll tm=tl+(tr-tl)/2;
        if(seg[2*src+1]>=k) {
            ans=min(ans,findmn(2*src+1,tl,tm,k));
        }
        else if(seg[2*src+2]>=k) {
            ans=min(ans,findmn(2*src+2,tm+1,tr,k));
        }
        return ans;
    }
    ll findSum(ll src,ll tl,ll tr, ll l ,ll r) {
        if(l>r) {
            return 0;
        }
        if(tl==l and tr==r) return seg[src];
        ll tm=tl+(tr-tl)/2;
        return findSum(2*src+1,tl,tm,l,min(tm,r)) + findSum(2*src+2,tm+1,tr,max(tm+1,l),r);
    }

};

vector<ll> manacher(string ns){
    ll l=0;
    ll r=1;
    ll n=sz(ns);
    vector<ll>d(n,0);
    for(int i=1;i<=sz(ns)-2;i++) {
        d[i]=min(r-i,d[l+(r-i)]);
        while(ns[i-d[i]] == ns[i+d[i]]) d[i]++;
        if(i+d[i]>r) {
            l=i-d[i];
            r=i+d[i];
        }
    }
    return vector<ll>(begin(d)+1,end(d)-1);
}





/*
think of binary search
think in reverese direction
solve equation mathematically
try to merge two operation in one or split one operation in two
find optimal soln without using operation
*/
// d[0]=1;
// derangement  d(n)=(n-1)*(d(n-1)+d(n-2));
void solve() { 
    ll n,m;
    cin>>n>>m;
    vector<vector<vector<ll>>>adj(n+1);
    map<pll,ll>mp;
    map<pll,ll>ct;
    for(int i=1;i<=m;i++) {
        ll u,v,w1,w2;
        cin>>u>>v>>w1>>w2;
        adj[u].pb({v,w1,w2});
        adj[v].pb({u,w1,w2});
        mp[{u,v}]=w1;
        mp[{v,u}]=w1;
        ct[{u,v}]=w2;
        ct[{v,u}]=w2;
    }
    vector<map<ll,ll>>sm(n+1);
    for(int u=1;u<=n;u++) {
        for(auto v:adj[u]) {
            sm[u][v[1]]+=v[2];
        }
    }
    // vector<ll>vis(n+1,0);
    // auto dfs=[&](auto&&f,ll src) -> void {
    //     vis[src]=1;
    //     for(auto nbr:adj[src]) {
    //         ll nbrN=nbr[0];
    //         ll nbrCl=nbr[1];
    //         ll nbrCc=nbr[2];
    //         if(vis[nbrN]) {
    //             sm[src][nbrCl]+=nbrCc;
    //             continue;
    //         }
    //         sm[src][nbrCl]+=nbrCc;
    //         f(f,nbrN);
    //     }
    // };
    // dfs(dfs,1LL);
    vector<vector<ll>>d(n+1,vector<ll>(2,LINF));
    priority_queue<vector<ll>,vector<vector<ll>>,greater<vector<ll>>>pq;
    pq.push({0,1,0,0});
    pq.push({0,1,1,0});
    d[1][0]=0;
    d[1][1]=0;
    vector<vector<ll>>vis1(n+1,vector<ll>(2,0));
    while(!pq.empty()) {
        auto tp=pq.top();
        pq.pop();
        ll srcN=tp[1];
        ll srcD=tp[0];
        ll nChng=tp[2];
        ll p=tp[3];
        if(vis1[srcN][nChng]) continue;
        // vis1[srcN][nChng]=1;

        for(auto nbr:adj[srcN]) {
            ll nbrN=nbr[0];
            ll nbrCl=nbr[1];
            ll nbrCc=nbr[2];
            ll sum=sm[srcN][nbrCl];
            if(sum!=nbrCc) {
                if(mp[{srcN,p}]==nbrCl) {
                    ll cs=sum-ct[{srcN,p}];
                    if(nChng) {
                        cs-=nbrCc;
                        if(d[nbrN][0]>srcD+cs) {
                            d[nbrN][0]=srcD+cs;
                            pq.push({d[nbrN][0],nbrN,0,srcN});
                        }
                        if(d[nbrN][1]>nbrCc+srcD) {
                            d[nbrN][1]=nbrCc+srcD;
                            pq.push({d[nbrN][1],nbrN,1,srcN});
                        }
                    }else {
                        // cs+=ct[]
                        if(d[nbrN][1]>srcD+nbrCc) {
                            d[nbrN][1]=srcD+nbrCc;
                            pq.push({d[nbrN][1],nbrN,1,srcN});
                        }    
                    }
                    
                }else {
                    ll cs=sum-nbrCc;
                    if(d[nbrN][0]>srcD+cs) {
                        d[nbrN][0]=srcD+cs;
                        pq.push({d[nbrN][0],nbrN,0,srcN});
                    }
                    if(d[nbrN][1]>srcD+nbrCc) {
                        d[nbrN][1]=srcD+nbrCc;
                        pq.push({d[nbrN][1],nbrN,1,srcN});
                    }
                }
            }else {
                if(d[nbrN][0]>srcD) {
                    d[nbrN][0]=srcD;
                    pq.push({d[nbrN][0],nbrN,0,srcN});
                }
                if(d[nbrN][1]>srcD+nbrCc) {
                    d[nbrN][1]=srcD+nbrCc;
                    pq.push({d[nbrN][1],nbrN,1,srcN});
                }
            }

        }

    }  
    // debug(d)
    if(min(d[n][0],d[n][1])==LINF) {
        cout<<-1<<endl;
        return;
    }
    cout<<min(d[n][0],d[n][1])<<endl;  
}   
int main()

{
    // freopen("shortcut.in", "r", stdin);
    // freopen("shortcut.out", "w", stdout);
    fastio()
    #ifndef ONLINE_JUDGE
        freopen("errorf.in","w",stderr);
    #endif
    ll int t=1;
    // cin >> t;
    while(t--) solve();
    return 0;
}


    #include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include<tuple>
using namespace std;
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define fastio() ios::sync_with_stdio(false);cin.tie(nullptr);
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define pll pair<ll,ll>
#define pb push_back
#define fi first
#define se second
#define ll long long
#define lld double
#define sz(a) (ll)(a.size())
#define cy cout<<"YES"<<endl
#define cn cout<<"NO"<<endl
#define endl '\n'
const long long LINF = 1e18;
const ll MOD = 1e9+7;  
#ifndef ONLINE_JUDGE
#define debug(x) cerr << #x << '=';_print(x);cerr << endl;
#else
#define debug(x)
#endif
void _print(int x) { cerr << x; }
void _print(long long x) { cerr << x; }
void _print(double x) { cerr << x; }
void _print(char x) { cerr << x; }
void _print(const string &x) { cerr << x; }
void _print(bool x) { cerr << (x ? '1' : '0'); }
void _print(pair<ll,ll> p) { cerr << '{' ;_print(p.first);cerr<<' ';_print(p.second);cerr<<'}'; }
template <typename T>
void _print(const vector<T> &v)
{cerr << '[';for (const auto &i : v){_print(i);cerr << ' ';}cerr << ']';}
template <typename T>
void _print(const multiset<T> &s){cerr << '{';for (const auto &i : s){_print(i);cerr << ' ';}cerr << '}';}
template <typename T>
void _print(const set<T> &s){cerr << '{';for (const auto &i : s){_print(i);cerr << ' ';}cerr << '}';}
template <typename K, typename V>
void _print(const map<K, V> &m){cerr << '{'<<endl;for (const auto &p : m){cerr << '(';_print(p.first);cerr << ':';_print(p.second);cerr << ')';}cerr << endl<<'}';}
template <typename T1, typename T2>
void _print(const pair<T1, T2> &p){cerr << '(';_print(p.first);cerr << ',';_print(p.second);cerr << ')';}
ll mod_add(ll&a,ll&b,ll m) {return (a+b)%m;}
ll mod_mul(ll&a,ll&b, ll m) {return (a*b)%m;}
ll mod_sub(ll&a,ll&b,ll m) {return ((a-b)%m+m)%m;}
ll gcd(ll a,ll b) {if(b==0) return a;return gcd(b,a%b);}
ll lcm(ll a,ll b) {return a*b/gcd(a,b);}
ll binExpo(ll a,ll n) {ll res=1;while(n) {if(n&1) {res=(res*a);}a=(a*a); n>>=1;}return res;}
ll N=3*1e5;
ll binExpom(ll a,ll n) {ll res=1;while(n) {if(n&1) {res=(res*a); res%=MOD;}a=(a*a); a%=MOD; n>>=1;}return res;}
ll modInv(ll a,ll mod) {return binExpom(a,mod-2);}
vector<ll>fact(N+2,0);
void calcFact() {fact[0]=1;fact[1]=1;for(ll i=2;i<=N;i++){fact[i]=mod_mul(fact[i-1],i,MOD);}}
ll ncr(ll n,ll r)
 {ll numr=fact[n];ll den=mod_mul(fact[n-r],fact[r],MOD);ll ans=(modInv(den,MOD)*numr)%MOD;return ans;}
vector<ll> sieve(ll N) {vector<ll>primes(N+1,1);primes[0]=primes[1]=0;for(int i=2;i*i<=N;i++) {for
(int j=i*i;j<=N;j+=i) {primes[j]=0;}}return primes;}
ll extEuclid(ll a,ll b,ll&x ,ll& y) {
if(b==0) {x=1;y=0;return a;}ll x1,y1;ll d=extEuclid(b,a%b,x1,y1);x=y1;y=x1-y1*(a/b);return d;}
vector<ll> findLps(string &s)
{vector<ll> lps(sz(s) + 1, 0);
ll len = 0;ll i = 1;ll n = sz(s);while (i < n){if (s[i] == s[len]){len++;lps[i] = len;i++;}else{if (len != 0){len = lps[len - 1];}else{len = 0;lps[i] = 0;i++;}}}return lps;}
vector<ll> calcZarray(string &s)
{ll n = sz(s);vector<ll> z(n + 1, 0);ll l = 0;ll r = 0;ll i = 1;while (i < n){
if (i < r){if (z[i - l] < r - l + 1){z[i] = z[i - l];}else{l = i;while (r < n and s[r] == s[r - l])r++;z[i] = r - l;r--;i++;}}else{l = i;r = i;while (r < n and s[r - l] == s[r]){r++;}z[i] = r - l;r--;i++;}}return z;}
vector<ll> segSieve(ll l, ll r, ll n){
vector<ll> prime = sieve(n);vector<ll> rangePrime(n + 1, 1);for (int i = 2; i * i <= r; i++){if (prime[i] == 1){int j = (l / i) * i;if (j < l){j += i;}j = max(i * i, j);for (int init = j - l; init < n; init += i){rangePrime[init] = 0;}}}return rangePrime;}
// /
void rabin_karp(string const& s, string const& t) {
auto f=[&](string str)-> ll{ll ht=0;for(int i=0;i<sz(str);i++) {ht=(ht*31 + str[i]-'a'+1)%MOD;}return ht;};ll h=0;ll n=sz(s);debug(n);vector<ll>ph(n+1,0);for(int i=0;i<n;i++) {ll dig=s[i]-'a'+1;h=(h*31LL+dig)%MOD;ph[i]=h;}ll cnt=0;ll ht=f(t);if(ph[sz(t)-1]==ht) cnt++;ll ws=sz(t);ll sub=binExpo(31,ws);for(int i=1;i<=n-ws;i++) {ll currH=ph[i+ws-1];currH=((currH-ph[i-1]*sub)%MOD + MOD)%MOD;if(currH==ht) cnt++;}}
/*<------------------------------------------------------------------------>*/
void binaryLifting(ll src,ll parent,vector<vector<ll>>&adj,vector<vector<ll>>&dp,vector<ll>&lvl,ll curr) {
    lvl[src]=curr;
    dp[src][0]=parent;
    debug(src)
    for(int i=1;i<=19;i++) {
        dp[src][i]=dp[dp[src][i-1]][i-1];
    }

    for(auto nbr:adj[src]) {
        if(nbr==parent) continue;

        binaryLifting(nbr,src,adj,dp,lvl,curr+1);

    }
}

vector<vector<ll>> buildSparseTable(ll n,vector<ll>&a) {
    vector<vector<ll>>st(20,vector<ll>(n+2,0));

    n=a.size();
    for(int i=0;i<n;i++) {
        st[0][i]=a[i];
    }
    for(int i=1;(1<<i)<=n;i++) {
        for(int j=0;j+(1<<i)<=n;j++) {
            st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
            // st[i][j]=gcd(st[i-1][j],st[i-1][j+(1<<(i-1))]);
        }
    }
    return st;

}
vector<ll> logTable(ll n) {
    vector<ll>lg(n+2,0);
    lg[1]=0;
    for(int i=2;i<=n;i++) {
        lg[i]=lg[i/2]+1;
    }
    return lg;
}
class SegTree {
private:
    vector<ll>seg;
    ll size;
public:
    SegTree(ll n) {
        // this->size=n;
        seg.resize(4*n+1,0);
    }
    void build(ll src,ll tl,ll tr,vector<ll>&a) {
        if(tl>tr) return;
        if(tl==tr) {
            seg[src]= a[tl];
            // seg[src]=vector<ll>(1,a[tl]);
            return;
        }
        ll tm=tl+(tr-tl)/2;
        build(2*src+1,tl,tm,a);
        build(2*src+2,tm+1,tr,a);
        seg[src]=(seg[2*src+1]+seg[2*src+2]);
        // seg[src]=max(seg[2*src+1],seg[2*src+2]);
        // merge(all(seg[2*src+1]),all(seg[2*src+2]),seg[src].begin());

    }
    void update(ll src,ll tl,ll tr,ll& pos,ll &val) {
        if(tl>tr) return;
        if(tl==tr) {
            seg[src]=val;
            return;
        }

        ll tm=tl+(tr-tl)/2;
        if(pos<=tm) {
            update(2*src+1,tl,tm,pos,val);
        }else {
            update(2*src+2,tm+1,tr,pos,val);
        }
        // seg[src]=max(seg[2*src+1],seg[2*src+2]);
        seg[src]=(seg[2*src+1]+seg[2*src+2]);
        // seg[src]=merge(seg[2*src+1],seg[2*src+2]);

    }
    ll findmn(ll src,ll tl,ll tr,ll k) {
        if(tl==tr) {
            return tl;
        }
        ll ans=1e6;
        ll tm=tl+(tr-tl)/2;
        if(seg[2*src+1]>=k) {
            ans=min(ans,findmn(2*src+1,tl,tm,k));
        }
        else if(seg[2*src+2]>=k) {
            ans=min(ans,findmn(2*src+2,tm+1,tr,k));
        }
        return ans;
    }
    ll findSum(ll src,ll tl,ll tr, ll l ,ll r) {
        if(l>r) {
            return 0;
        }
        if(tl==l and tr==r) return seg[src];
        ll tm=tl+(tr-tl)/2;
        return findSum(2*src+1,tl,tm,l,min(tm,r)) + findSum(2*src+2,tm+1,tr,max(tm+1,l),r);
    }

};

vector<ll> manacher(string ns){
    ll l=0;
    ll r=1;
    ll n=sz(ns);
    vector<ll>d(n,0);
    for(int i=1;i<=sz(ns)-2;i++) {
        d[i]=min(r-i,d[l+(r-i)]);
        while(ns[i-d[i]] == ns[i+d[i]]) d[i]++;
        if(i+d[i]>r) {
            l=i-d[i];
            r=i+d[i];
        }
    }
    return vector<ll>(begin(d)+1,end(d)-1);
}





/*
think of binary search
think in reverese direction
solve equation mathematically
try to merge two operation in one or split one operation in two
find optimal soln without using operation
*/
// d[0]=1;
// derangement  d(n)=(n-1)*(d(n-1)+d(n-2));
void solve() { 
    ll n,m;
    cin>>n>>m;
    vector<vector<vector<ll>>>adj(n+1);
    map<pll,ll>mp;
    map<pll,ll>ct;
    for(int i=1;i<=m;i++) {
        ll u,v,w1,w2;
        cin>>u>>v>>w1>>w2;
        adj[u].pb({v,w1,w2});
        adj[v].pb({u,w1,w2});
        mp[{u,v}]=w1;
        mp[{v,u}]=w1;
        ct[{u,v}]=w2;
        ct[{v,u}]=w2;
    }
    vector<map<ll,ll>>sm(n+1);
    for(int u=1;u<=n;u++) {
        for(auto v:adj[u]) {
            sm[u][v[1]]+=v[2];
        }
    }
    // vector<ll>vis(n+1,0);
    // auto dfs=[&](auto&&f,ll src) -> void {
    //     vis[src]=1;
    //     for(auto nbr:adj[src]) {
    //         ll nbrN=nbr[0];
    //         ll nbrCl=nbr[1];
    //         ll nbrCc=nbr[2];
    //         if(vis[nbrN]) {
    //             sm[src][nbrCl]+=nbrCc;
    //             continue;
    //         }
    //         sm[src][nbrCl]+=nbrCc;
    //         f(f,nbrN);
    //     }
    // };
    // dfs(dfs,1LL);
    vector<vector<ll>>d(n+1,vector<ll>(2,LINF));
    priority_queue<vector<ll>,vector<vector<ll>>,greater<vector<ll>>>pq;
    pq.push({0,1,0,0});
    pq.push({0,1,1,0});
    d[1][0]=0;
    d[1][1]=0;
    vector<vector<ll>>vis1(n+1,vector<ll>(2,0));
    while(!pq.empty()) {
        auto tp=pq.top();
        pq.pop();
        ll srcN=tp[1];
        ll srcD=tp[0];
        ll nChng=tp[2];
        ll p=tp[3];
        if(vis1[srcN][nChng]) continue;
        // vis1[srcN][nChng]=1;

        for(auto nbr:adj[srcN]) {
            ll nbrN=nbr[0];
            ll nbrCl=nbr[1];
            ll nbrCc=nbr[2];
            ll sum=sm[srcN][nbrCl];
            if(sum!=nbrCc) {
                if(mp[{srcN,p}]==nbrCl) {
                    ll cs=sum-ct[{srcN,p}];
                    if(nChng) {
                        cs-=nbrCc;
                        if(d[nbrN][0]>srcD+cs) {
                            d[nbrN][0]=srcD+cs;
                            pq.push({d[nbrN][0],nbrN,0,srcN});
                        }
                        if(d[nbrN][1]>nbrCc+srcD) {
                            d[nbrN][1]=nbrCc+srcD;
                            pq.push({d[nbrN][1],nbrN,1,srcN});
                        }
                    }else {
                        // cs+=ct[]
                        if(d[nbrN][1]>srcD+nbrCc) {
                            d[nbrN][1]=srcD+nbrCc;
                            pq.push({d[nbrN][1],nbrN,1,srcN});
                        }    
                    }
                    
                }else {
                    ll cs=sum-nbrCc;
                    if(d[nbrN][0]>srcD+cs) {
                        d[nbrN][0]=srcD+cs;
                        pq.push({d[nbrN][0],nbrN,0,srcN});
                    }
                    if(d[nbrN][1]>srcD+nbrCc) {
                        d[nbrN][1]=srcD+nbrCc;
                        pq.push({d[nbrN][1],nbrN,1,srcN});
                    }
                }
            }else {
                if(d[nbrN][0]>srcD) {
                    d[nbrN][0]=srcD;
                    pq.push({d[nbrN][0],nbrN,0,srcN});
                }
                if(d[nbrN][1]>srcD+nbrCc) {
                    d[nbrN][1]=srcD+nbrCc;
                    pq.push({d[nbrN][1],nbrN,1,srcN});
                }
            }

        }

    }  
    // debug(d)
    if(min(d[n][0],d[n][1])==LINF) {
        cout<<-1<<endl;
        return;
    }
    cout<<min(d[n][0],d[n][1])<<endl;  
}   
int main()

{
    // freopen("shortcut.in", "r", stdin);
    // freopen("shortcut.out", "w", stdout);
    fastio()
    #ifndef ONLINE_JUDGE
        freopen("errorf.in","w",stderr);
    #endif
    ll int t=1;
    // cin >> t;
    while(t--) solve();
    return 0;
}


    

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp:362:17: error: redefinition of 'const long long int LINF'
  362 | const long long LINF = 1e18;
      |                 ^~~~
Main.cpp:22:17: note: 'const long long int LINF' previously defined here
   22 | const long long LINF = 1e18;
      |                 ^~~~
Main.cpp:363:10: error: redefinition of 'const long long int MOD'
  363 | const ll MOD = 1e9+7;
      |          ^~~
Main.cpp:23:10: note: 'const long long int MOD' previously defined here
   23 | const ll MOD = 1e9+7;
      |          ^~~
Main.cpp:369:6: error: redefinition of 'void _print(int)'
  369 | void _print(int x) { cerr << x; }
      |      ^~~~~~
Main.cpp:29:6: note: 'void _print(int)' previously defined here
   29 | void _print(int x) { cerr << x; }
      |      ^~~~~~
Main.cpp:370:6: error: redefinition of 'void _print(long long int)'
  370 | void _print(long long x) { cerr << x; }
      |      ^~~~~~
Main.cpp:30:6: note: 'void _print(long long int)' previously defined here
   30 | void _print(long long x) { cerr << x; }
      |      ^~~~~~
Main.cpp:371:6: error: redefinition of 'void _print(double)'
  371 | void _print(double x) { cerr << x; }
      |      ^~~~~~
Main.cpp:31:6: note: 'void _print(double)' previously defined here
   31 | void _print(double x) { cerr << x; }
      |      ^~~~~~
Main.cpp:372:6: error: redefinition of 'void _print(char)'
  372 | void _print(char x) { cerr << x; }
      |      ^~~~~~
Main.cpp:32:6: note: 'void _print(char)' previously defined here
   32 | void _print(char x) { cerr << x; }
      |      ^~~~~~
Main.cpp:373:6: error: redefinition of 'void _print(const std::string&)'
  373 | void _print(const string &x) { cerr << x; }
      |      ^~~~~~
Main.cpp:33:6: note: 'void _print(const std::string&)' previously defined here
   33 | void _print(const string &x) { cerr << x; }
      |      ^~~~~~
Main.cpp:374:6: error: redefinition of 'void _print(bool)'
  374 | void _print(bool x) { cerr << (x ? '1' : '0'); }
      |      ^~~~~~
Main.cpp:34:6: note: 'void _print(bool)' previously defined here
   34 | void _print(bool x) { cerr << (x ? '1' : '0'); }
      |      ^~~~~~
Main.cpp:375:6: error: redefinition of 'void _print(std::pair<long long int, long long int>)'
  375 | void _print(pair<ll,ll> p) { cerr << '{' ;_print(p.first);cerr<<' ';_print(p.second);cerr<<'}'; }
      |      ^~~~~~
Main.cpp:35:6: note: 'void _print(std::pair<long long int, long long int>)' previously defined here
   35 | void _print(pair<ll,ll> p) { cerr << '{' ;_print(p.first);cerr<<' ';_print(p.second);cerr<<'}'; }
      |      ^~~~~~
Main.cpp:377:6: error: redefinition of 'template<class T> void _print(const std::vector<_Tp>&)'
  377 | void _print(const vector<T> &v)
      |      ^~~~~~
Main.cpp:37:6: note: 'template<class T> void _print(const std::vector<_Tp>&)' previously declared here
   37 | void _print(const vector<T> &v)
      |      ^~~~~~
Main.cpp:380:6: error: redefinition of 'template<class T> void _print(const std::multiset<T>&)'
  380 | void _print(const multiset<T> &s){cerr << '{';for (const auto &i : s){_print(i);cerr << ' ';}cerr << '}';}
      |      ^~~~~~
Main.cpp:40:6: note: 'template<class T> void _print(const std::multiset<T>&)' previously declared here
   40 | void _print(const multiset<T> &s){cerr << '{';for (const auto &i : s){_print(i);cerr << ' ';}cerr << '}';}
      |      ^~~~~~
Main.cpp:382:6: error: redefinition of 'template<class T> void _print(const std::set<T>&)'
  382 | void _print(const set<T> &s){cerr << '{';for (const auto &i : s){_print(i);cerr << ' ';}cerr << '}';}
      |      ^~~~~~
Main.cpp:42:6: note: 'template<class T> void _print(const std::set<T>&)' previously declared here
   42 | void _print(const set<T> &s){cerr << '{';for (const auto &i : s){_print(i);cerr << ' ';}cerr << '}';}
      |      ^~~~~~
Main.cpp:384:6: error: redefinition of 'template<class K, class V> void _print(const std::map<K, V>&)'
  384 | void _print(const map<K, V> &m){cerr << '{'<<endl;for (const auto &p : m){cerr << '(';_print(p.first);cerr << ':';_print(p.second);cerr << ')';}cerr << endl<<'}';}
      |      ^~~~~~
Main.cpp:44:6: note: 'template<class K, class V> void _print(const std::map<K, V>&)' previously declared here
   44 | void _print(const map<K, V> &m){cerr << '{'<<endl;for (const auto &p : m){cerr << '(';_print(p.first);cerr << ':';_print(p.second);cerr << ')';}cerr << endl<<'}';}
      |      ^~~~~~
Main.cpp:386:6: error: redefinition of 'template<class T1, class T2> void _print(const std::pair<_T1, _T2>&)'
  386 | void _print(const pair<T1, T2> &p){cerr << '(';_print(p.first);cerr << ',';_print(p.second);cerr << ')';}
      |      ^~~~~~
Main.cpp:46:6: note: 'template<class T1, class T2> void _print(const std::pair<_T1, _T2>&)' previously declared here
   46 | void _print(const pair<T1, T2> &p){cerr << '(';_print(p.first);cerr << ',';_print(p.second);cerr << ')';}
      |      ^~~~~~
Main.cpp:387:4: error: redefinition of 'long long int mod_add(long long int&, long long int&, long long int)'
  387 | ll mod_add(ll&a,ll&b,ll m) {return (a+b)%m;}
      |    ^~~~~~~
Main.cpp:47:4: note: 'long long int mod_add(long long int&, long long int&, long long int)' previously defined here
   47 | ll mod_add(ll&a,ll&b,ll m) {return (a+b)%m;}
      |    ^~~~~~~
Main.cpp:388:4: error: redefinition of 'long long int mod_mul(long long int&, long long int&, long long int)'
  388 | ll mod_mul(ll&a,ll&b, ll m) {return (a*b)%m;}
      |    ^~~~~~~
Main.cpp:48:4: note: 'long long int mod_mul(long long int&, long long int&, long long int)' previously defined here
   48 | ll mod_mul(ll&a,ll&b, ll m) {return (a*b)%m;}
      |    ^~~~~~~
Main.cpp:389:4: error: redefinition of 'long long int mod_sub(long long int&, long long int&, long long int)'
  389 | ll mod_sub(ll&a,ll&b,ll m) {return ((a-b)%m+m)%m;}
      |    ^~~~~~~
Main.cpp:49:4: note: 'long long int mod_sub(long long int&, long long int&, long long int)' previously defined here
   49 | ll mod_sub(ll&a,ll&b,ll m) {return ((a-b)%m+m)%m;}
      |    ^~~~~~~
Main.cpp:390:4: error: redefinition of 'long long int gcd(long long int, long long int)'
  390 | ll gcd(ll a,ll b) {if(b==0) return a;return gcd(b,a%b);}
      |    ^~~
Main.cpp:50:4: note: 'long long int gcd(long long int, long long int)' previously defined here
   50 | ll gcd(ll a,ll b) {if(b==0) return a;return gcd(b,a%b);}
      |    ^~~
Main.cpp:391:4: error: redefinition of 'long long int lcm(long long int, long long int)'
  391 | ll lcm(ll a,ll b) {return a*b/gcd(a,b);}
      |    ^~~
Main.cpp:51:4: note: 'long long int lcm(long long int, long long int)' previously defined here
   51 | ll lcm(ll a,ll b) {return a*b/gcd(a,b);}
      |    ^~~
Main.cpp:392:4: error: redefinition of 'long long int binExpo(long long int, long long int)'
  392 | ll binExpo(ll a,ll n) {ll res=1;while(n) {if(n&1) {res=(res*a);}a=(a*a); n>>=1;}return res;}
      |    ^~~~~~~
Main.cpp:52:4: note: 'long long int binExpo(long long int, long long int)' previously defined here
   52 | ll binExpo(ll a,ll n) {ll res=1;while(n) {if(n&1) {res=(res*a);}a=(a*a); n>>=1;}return res;}
      |    ^~~~~~~
Main.cpp:393:4: error: redefinition of 'long long int N'
  393 | ll N=3*1e5;
      |    ^
Main.cpp:53:4: note: 'long long int N' previously defined here
   53 | ll N=3*1e5;
      |    ^
Main.cpp:394:4: error: redefinition of 'long long int binExpom(long long int, long long int)'
  394 | ll binExpom(ll a,ll n) {ll res=1;while(n) {if(n&1) {res=(res*a); res%=MOD;}a=(a*a); a%=MOD; n>>=1;}return res;}
      |    ^~~~~~~~
Main.cpp:54:4: note: 'long long int binExpom(long long int, long long int)' previously defined here
   54 | ll binExpom(ll a,ll n) {ll res=1;while(n) {if(n&1) {res=(res*a); res%=MOD;}a=(a*a); a%=MOD; n>>=1;}return res;}
      |    ^~~~~~~~
Main.cpp:395:4: error: redefinition of 'long long int modInv(long long int, long long int)'
  395 | ll modInv(ll a,ll mod) {return binExpom(a,mod-2);}
      |    ^~~~~~
Main.cpp:55:4: note: 'long long int modInv(long long int, long long int)' previously defined here
   55 | ll modInv(ll a,ll mod) {return binExpom(a,mod-2);}
      |    ^~~~~~
Main.cpp:396:11: error: redefinition of 'std::vector<long long int> fact'
  396 | vector<ll>fact(N+2,0);
      |           ^~~~
Main.cpp:56:11: note: 'std::vector<long long int> fact' previously declared here
   56 | vector<ll>fact(N+2,0);
      |           ^~~~
Main.cpp:397:6: error: redefinition of 'void calcFact()'
  397 | void calcFact() {fact[0]=1;fact[1]=1;for(ll i=2;i<=N;i++){fact[i]=mod_mul(fact[i-1],i,MOD);}}
      |      ^~~~~~~~
Main.cpp:57:6: note: 'void calcFact()' previously defined here
   57 | void calcFact() {fact[0]=1;fact[1]=1;for(ll i=2;i<=N;i++){fact[i]=mod_mul(fact[i-1],i,MOD);}}
      |      ^~~~~~~~
Main.cpp:398:4: error: redefinition of 'long long int ncr(long long int, long long int)'
  398 | ll ncr(ll n,ll r)
      |    ^~~
Main.cpp:58:4: note: 'long long int ncr(long long int, long long int)' previously defined here
   58 | ll ncr(ll n,ll r)
      |    ^~~
Main.cpp:400:12: error: redefinition of 'std::vector<long long int> sieve(long long int)'
  400 | vector<ll> sieve(ll N) {vector<ll>primes(N+1,1);primes[0]=primes[1]=0;for(int i=2;i*i<=N;i++) {for
      |            ^~~~~
Main.cpp:60:12: note: 'std::vector<long long int> sieve(long long int)' previously defined here
   60 | vector<ll> sieve(ll N) {vector<ll>primes(N+1,1);primes[0]=primes[1]=0;for(int i=2;i*i<=N;i++) {for
      |            ^~~~~
Main.cpp:402:4: error: redefinition of 'long long int extEuclid(long long int, long long int, long long int&, long long int&)'
  402 | ll extEuclid(ll a,ll b,ll&x ,ll& y) {
      |    ^~~~~~~~~
Main.cpp:62:4: note: 'long long int extEuclid(long long int, long long int, long long int&, long long int&)' previously defined here
   62 | ll extEuclid(ll a,ll b,ll&x ,ll& y) {
      |    ^~~~~~~~~
Main.cpp:404:12: error: redefinition of 'std::vector<long long int> findLps(std::string&)'
  404 | vector<ll> findLps(string &s)
      |            ^~~~~~~
Main.cpp:64:12: note: 'std::vector<long long int> findLps(std::string&)' previously defined here
   64 | vector<ll> findLps(string &s)
      |            ^~~~~~~
Main.cpp:407:12: error: redefinition of 'std::vector<long long int> calcZarray(std::string&)'
  407 | vector<ll> calcZarray(string &s)
      |            ^~~~~~~~~~
Main.cpp:67:12: note: 'std::vector<long long int> calcZarray(std::string&)' previously defined here
   67 | vector<ll> calcZarray(string &s)
      |            ^~~~~~~~~~
Main.cpp:410:12: error: redefinition of 'std::vector<long long int> segSieve(long long int, long long int, long long int)'
  410 | vector<ll> segSieve(ll l, ll r, ll n){
      |            ^~~~~~~~
Main.cpp:70:12: note: 'std::vector<long long int> segSieve(long long int, long long int, long long int)' previously defined here
   70 | vector<ll> segSieve(ll l, ll r, ll n){
      |            ^~~~~~~~
Main.cpp:413:6: error: redefinition of 'void rabin_karp(const std::string&, const std::string&)'
  413 | void rabin_karp(string const& s, string const& t) {
      |      ^~~~~~~~~~
Main.cpp:73:6: note: 'void rabin_karp(const std::string&, const std::string&)' previously defined here
   73 | void rabin_karp(string const& s, string const& t) {
      |      ^~~~~~~~~~
Main.cpp:416:6: error: redefinition of 'void binaryLifting(long long int, long long int, std::vector<std::vector<long long int> >&, std::vector<std::vector<long long int> >&, std::vector<long long int>&, long long int)'
  416 | void binaryLifting(ll src,ll parent,vector<vector<ll>>&adj,vector<vector<ll>>&dp,vector<ll>&lvl,ll curr) {
      |      ^~~~~~~~~~~~~
Main.cpp:76:6: note: 'void binaryLifting(long long int, long long int, std::vector<std::vector<long long int> >&, std::vector<std::vector<long long int> >&, std::vector<long long int>&, long long int)' previously defined here
   76 | void binaryLifting(ll src,ll parent,vector<vector<ll>>&adj,vector<vector<ll>>&dp,vector<ll>&lvl,ll curr) {
      |      ^~~~~~~~~~~~~
Main.cpp:432:20: error: redefinition of 'std::vector<std::vector<long long int> > buildSparseTable(long long int, std::vector<long long int>&)'
  432 | vector<vector<ll>> buildSparseTable(ll n,vector<ll>&a) {
      |                    ^~~~~~~~~~~~~~~~
Main.cpp:92:20: note: 'std::vector<std::vector<long long int> > buildSparseTable(long long int, std::vector<long long int>&)' previously defined here
   92 | vector<vector<ll>> buildSparseTable(ll n,vector<ll>&a) {
      |                    ^~~~~~~~~~~~~~~~
Main.cpp:448:12: error: redefinition of 'std::vector<long long int> logTable(long long int)'
  448 | vector<ll> logTable(ll n) {
      |            ^~~~~~~~
Main.cpp:108:12: note: 'std::vector<long long int> logTable(long long int)' previously defined here
  108 | vector<ll> logTable(ll n) {
      |            ^~~~~~~~
Main.cpp:456:7: error: redefinition of 'class SegTree'
  456 | class SegTree {
      |       ^~~~~~~
Main.cpp:116:7: note: previous definition of 'class SegTree'
  116 | class SegTree {
      |       ^~~~~~~
Main.cpp:523:12: error: redefinition of 'std::vector<long long int> manacher(std::string)'
  523 | vector<ll> manacher(string ns){
      |            ^~~~~~~~
Main.cpp:183:12: note: 'std::vector<long long int> manacher(std::string)' previously defined here
  183 | vector<ll> manacher(string ns){
      |            ^~~~~~~~
Main.cpp:552:6: error: redefinition of 'void solve()'
  552 | void solve() {
      |      ^~~~~
Main.cpp:212:6: note: 'void solve()' previously defined here
  212 | void solve() {
      |      ^~~~~
Main.cpp:665:5: error: redefinition of 'int main()'
  665 | int main()
      |     ^~~~
Main.cpp:325:5: note: 'int main()' previously defined here
  325 | int main()
      |     ^~~~
Main.cpp: In function 'int main()':
Main.cpp:332:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  332 |         freopen("errorf.in","w",stderr);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp: In function 'int main()':
Main.cpp:672:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  672 |         freopen("errorf.in","w",stderr);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~