#include #include #include #include #include #include #include #pragma GCC optimize ("O3") using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); static clock_t startT; double timePassed() { clock_t currT = clock(); return (double) (currT - startT) / CLOCKS_PER_SEC; } const int MAX_N=1e4+4; const int MAX_M=5e5+5; const long long INF=(1LL<<61); short n,m; vectorbr[MAX_M]; vectorstagecol[MAX_N]; bool used[MAX_M]; long long c[MAX_N]; long long cnt[MAX_N]; vectorans,ansend; short rg[MAX_N]; long long prevv[MAX_N]; long long all; setvis[MAX_N]; long long calc() { for(short i=1;i<=n;i++){prevv[i]=0;} long long res=0; for(long long sz=1;sz<=m;sz++) { for(short col:br[ans[sz-1]]) { vis[col].insert(sz-1); if(prevv[col]!=0) { res+=(sz-prevv[col])*c[col]; } prevv[col]=sz; } } all=res; return res; } long long best; long long shorterval(short&col) { return (1LL*((*(vis[col].rbegin()))-(*(vis[col].begin()))))*c[col]; } void Sw(short&i,short&j) { for(short&col:br[ans[i]]) { if(vis[col].find(j)!=vis[col].end())continue; all-=shorterval(col); vis[col].erase(i); vis[col].insert(j); all+=shorterval(col); } for(short&col:br[ans[j]]) { if(vis[col].find(i)!=vis[col].end())continue; all-=shorterval(col); vis[col].erase(j); vis[col].insert(i); all+=shorterval(col); } } void fix() { for(short i=1;i<=m;i++)ansend.push_back(i); shuffle(ansend.begin(),ansend.end(),rng); ans=ansend; best=calc(); short i,j; while(timePassed()<=4.9) { i=rng()%m; j=rng()%m; if(i==j)continue; Sw(i,j); swap(ans[i],ans[j]); if(all>n>>m; for(short i=1;i<=n;i++) { cin>>c[i]; } for(short i=1;i<=m;i++) { rg[i]=i-1; short x; cin>>x; for(short j=1;j<=x;j++) { short ako; cin>>ako; stagecol[ako].push_back(i); br[i].push_back(ako); } } best=INF; fix(); for(short x:ans)cout<