rt
调了一上午了只过了个普通版,到加强这里就只有44了QAQ
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <bitset>
#define int long long
#define double long double
#define ild inline void
#define ill inline bool
#define ilt inline int
#define ilc inline char
#define ils inline string
#define ildo inline double
#define mem0(a) memset(a,0,sizeof(a))
#define memf(a) memset(a,0x3f,sizeof(a))
#define mem_f(a) memset(a,-0x3f,sizeof(a))
#define mem_1(a) memset(a,-1,sizeof(a))
#define pb(a,b) a.push_back(b)
#define pp(a,b) a.push_pront(b)
#define mp(a,b) make_pair(a,b)
#define p1(x) x.first
#define p2(x) x.second
#define lc(x) fhq[x].lc
#define rc(x) fhq[x].rc
#define enter putchar('\n')
#define space putchar(' ')
#define inl(x) x^=lastans
using namespace std;
ild re(int &x){
x=0;
int w=getchar();
bool p=0;
while(w<'0'||w>'9')p^=w=='-',w=getchar();
while(w<='9'&&w>='0')x=(x<<3)+(x<<1)+w-'0',w=getchar();
if(p)x=-x;
}
ild re(int &x1,int &x2){re(x1),re(x2);}
ild re(int &x1,int &x2,int &x3){re(x1),re(x2),re(x3);}
ild re(int &x1,int &x2,int &x3,int &x4){re(x1),re(x2),re(x3),re(x4);}
ild re(int &x1,int &x2,int &x3,int &x4,int &x5){re(x1),re(x2),re(x3),re(x4),re(x5);}
ild wr(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)wr(x/10);
putchar(x%10+'0');
}
struct subway{int u,v,p,q;}s[1000300];
ill cmp(subway x,subway y){
return x.p!=y.p?x.p<y.p:x.q<y.q;
}
struct dat{int ti,c,id;
bool operator <(const dat &x)const{
return x.ti<ti;
}
};
struct node{int x,y;
};
vector<dat>dp[100030];
vector<node>da[100300];
priority_queue<dat>ukev[100300];
int rl[100030];
struct stk{vector<int>t;
int hd;
ild push(int x){pb(t,x);}
ild pop(){t.pop_back();}
ilt siz(){return t.size()-hd;}
ill empty(){return siz()<=0;}
}st[100030];
int n,m;
int A,B,C;
inline pair<double,int> sl(int v,int a,int b){
if(da[v][a].x==da[v][b].x)return mp(0,-9999999999999999ll);
return mp((double)(da[v][a].y-da[v][b].y)/(da[v][a].x-da[v][b].x),0);}
ild ins(int v,int loc){
while(st[v].siz()>=2 ){
auto k1=sl(v,loc,st[v].t[st[v].t.size()-1]),k2=sl(v,st[v].t[st[v].t.size()-1],st[v].t[st[v].t.size()-2]);
auto e1=p1(k1)?p1(k1):p2(k1),e2=p1(k2)?p1(k2):p2(k2);
if(e1<e2)break;
st[v].pop();
}
st[v].push(loc);
}
ilt gt(int v,int k){
if(st[v].empty())return -1;
while(st[v].siz()>=2){
pair<double ,int>g=sl(v,st[v].hd,st[v].hd+1);
auto e=p1(g)?p1(g):p2(g);
if(e>k) break;
st[v].hd++;}
return st[v].t[st[v].hd];
}
signed main() {
freopen("/Users/noip2019/Desktop/ZZZZZZZZZZZZCW/CW‘s\ code/CW‘s\ code/datain.in","r",stdin);
re(n,m,A,B,C);
for(int i=1;i<=m;i++)re(s[i].u,s[i].v,s[i].p,s[i].q);
sort(s+1,s+m+1,cmp);
dp[1].push_back({0,0});
da[1].push_back({0,0});
ukev[1].push({0,0,0});
for(int i=1;i<=m;i++){
int u=s[i].u,v=s[i].v,p=s[i].p,q=s[i].q;
while(!ukev[u].empty()&&ukev[u].top().ti<=p){
ins(u,ukev[u].top().id);ukev[u].pop();
}
int k=2*A*p;
int j=gt(u,k);
if(j==-1) continue;
int x=q;
int b=da[u][j].y-k*da[u][j].x;
int y=(b+A*p*p+B*p+C+q)+A*q*q-B*q-q;
dp[v].push_back({q,b+A*p*p+B*p+C+q});
da[v].push_back({x,y});
ukev[v].push({q,b+A*p*p+B*p+C+q,(int)da[v].size()-1});
}
int ans=99999999999999999ll;
for(int i=0;i<dp[n].size();i++){
ans=min(dp[n][i].c,ans);
}
cout<<ans;
return 0;
}