//teja349 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //setbase - cout << setbase (16); cout << 100 << endl; Prints 64 //setfill - cout << setfill ('x') << setw (5); cout << 77 << endl; prints xxx77 //setprecision - cout << setprecision (14) << f << endl; Prints x.xxxx //cout.precision(x) cout<=b;i--) #define pb push_back #define mp make_pair #define vi vector< int > #define vl vector< ll > #define ss second #define ff first #define ll long long #define pii pair< int,int > #define pll pair< ll,ll > #define sz(a) a.size() #define inf (1000*1000*1000+5) #define all(a) a.begin(),a.end() #define tri pair #define vii vector #define vll vector #define viii vector #define mod (1000*1000*1000+7) #define pqueue priority_queue< int > #define pdqueue priority_queue< int,vi ,greater< int > > #define flush fflush(stdout) #define primeDEN 727999983 mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //#define int ll // find_by_order() // order_of_key typedef tree< int, null_type, less, rb_tree_tag, tree_order_statistics_node_update> ordered_set; int u[123456],v[123456],cost[123456],pres[123456]; int inv[123456]; vector vec(123456); ll dpleft[123456],dpright[123456],dpcurleft[123456],dpcurright[123456]; ll dpl[3][123456],dpr[3][123456]; int main(){ std::ios::sync_with_stdio(false); cin.tie(NULL); int t; cin>>t; ll iinf=inf; iinf*=inf; iinf*=3; while(t--){ int n,m,k; cin>>n>>m>>k; int remember=k; int i; vi vec1; set seti; rep(i,k){ cin>>u[i]>>v[i]>>cost[i]; u[i]--; v[i]--; seti.insert(mp(u[i],v[i])); pres[i]=1; vec1.pb(u[i]); } vec1.pb(0); sort(all(vec1)); vec1.resize(unique(all(vec1))-vec1.begin()); map mapi; rep(i,vec1.size()){ mapi[vec1[i]]=1; if(seti.find(mp(vec1[i],0))==seti.end()){ u[k]=vec1[i]; v[k]=0; cost[k]=0; pres[k]=0; k++; } if(seti.find(mp(vec1[i],m-1))==seti.end()){ u[k]=vec1[i]; v[k]=m-1; cost[k]=0; pres[k]=0; k++; } } int counter=0; int j; map::iterator it; for(it=mapi.begin();it!=mapi.end();it++){ it->ss=counter++; inv[counter-1]=it->ff; } rep(i,counter+2){ vec[i].clear(); } rep(i,k){ u[i]=mapi[u[i]]; vec[u[i]].pb(mp(v[i],i)); } rep(i,counter){ sort(all(vec[i])); } rep(i,remember+2){ dpleft[i]=iinf; dpright[i]=iinf; } inv[counter]=inv[counter-1]; int level,ind,width; fd(level,counter-1,0){ // left side column 0 rep(i,remember+2){ dpcurleft[i]=iinf; } ind=vec[level][0].ss; rep(i,remember+2){ if(i==0){ dpl[1][i]=0; continue; } dpl[1][i]=dpleft[i]+inv[level+1]-inv[level]; if(pres[ind]){ if(i==1) dpl[1][i]=min((ll)cost[ind],dpl[1][i]); else dpl[1][i]=min(cost[ind]+inv[level+1]-inv[level]+dpleft[i-1],dpl[1][i]); } } rep(i,remember+2){ dpcurleft[i]=min(dpcurleft[i],dpl[1][i]); } f(j,1,vec[level].size()){ rep(i,remember+2){ dpl[0][i]=dpl[1][i]; dpl[1][i]=iinf; } ind = vec[level][j].ss; rep(i,remember+2){ if(i==0){ dpl[1][i]=0; continue; } width = vec[level][j].ff-vec[level][j-1].ff; dpl[1][i]=dpl[0][i]+width; if(pres[ind]){ if(i==1) dpl[1][i]=min((ll)cost[ind],dpl[1][i]); else dpl[1][i]=min(cost[ind]+ width + dpl[0][i-1],dpl[1][i]); } } width=vec[level][j].ff; rep(i,remember+2){ dpcurleft[i]=min(dpcurleft[i],dpl[1][i]+width); } } // right side last column rep(i,remember+2){ dpcurright[i]=iinf; } ind=vec[level][(int)vec[level].size()-1].ss; rep(i,remember+2){ if(i==0){ dpr[1][i]=0; continue; } dpr[1][i]=dpright[i]+inv[level+1]-inv[level]; if(pres[ind]){ if(i==1) dpr[1][i]=min((ll)cost[ind],dpr[1][i]); else dpr[1][i]=min(cost[ind]+inv[level+1]-inv[level]+dpright[i-1],dpr[1][i]); } } rep(i,remember+2){ dpcurright[i]=min(dpcurright[i],dpr[1][i]); } fd(j,(int)vec[level].size()-2,0){ rep(i,remember+2){ dpr[0][i]=dpr[1][i]; dpr[1][i]=iinf; } ind = vec[level][j].ss; rep(i,remember+2){ if(i==0){ dpr[1][i]=0; continue; } width = vec[level][j+1].ff-vec[level][j].ff; dpr[1][i]=dpr[0][i]+width; if(pres[ind]){ if(i==1) dpr[1][i]=min((ll)cost[ind],dpr[1][i]); else dpr[1][i]=min(cost[ind]+ width + dpr[0][i-1],dpr[1][i]); } } width=m-1-vec[level][j].ff; rep(i,remember+2){ dpcurright[i]=min(dpcurright[i],dpr[1][i]+width); } } // moving across the line movement or stopping in middle ... rep(i,remember+2){ dpright[i]=min(dpcurright[i],dpl[1][i]); dpleft[i]=min(dpcurleft[i],dpr[1][i]); } } f(i,1,remember+1){ cout<