struct A{ ll d,x; }; bool operator<(A const&a, A const&b){ return a.d>b.d?true:a.db.x; } { vector s[3]; s[0].push_back({0,0}); s[1].push_back({0,0}); ll@n; rrep(h,n){ ll@a[3]; vector t[3]; rep(i,3){ vector u; rep(j,3){ if(i!=j){ for(auto b:s[j]){ ll x=b.x+a[i]; u.push_back({b.d+x,x=x==0?0:x-1}); } } } sort(u.begin(),u.end()); ll w=-1; for(auto b:u){ if(b.x>w){ w=b.x; t[i].push_back(b); } } } rep(i,3){ s[i]=t[i]; } } ll z=0; rep(i,3){ for(auto b:s[i]){ z=max(z,b.d); } } wt(z); }