#pragma GCC optimize "O3" #include #define rep(i,a,b) for (int i=a; i shops; vector H(h); for (int &c: H) scanf ("%d", &c); H.pb(0); for (int c: H) if (c > t) { printf ("0\n"); return 0; } vector stan(t+1, -1); //not free int tm = 0; for (int c: H) { tm++; rep(i,1,t+1) { if (i <= c) { if (stan[i] == -1) { stan[i] = tm; } } else { if (stan[i] > 0) { shops.pb(tm - stan[i]); stan[i] = -1; } } } } if ((int)shops.size() > t) { printf ("0\n"); return 0; } debug ("Shops: "); for (int s: shops) debug ("%d ", s); debug ("\n"); rep(i,0,T+1) rep(j,0,(1< > Teams(t); for (auto &p: Teams) scanf ("%d %d", &p.fi, &p.se); rep(mask,0,(1<= 0) { int wolne = ((1 << t) -1) ^ mask; for (int nowe = wolne; nowe > 0; nowe = (nowe - 1) & wolne) { if (Time[nowe] == shops[i-1]) { Dp[i][mask | nowe] = max(Dp[i][mask | nowe], Dp[i-1][mask] + Profit[nowe]); } } } } int best = 0; rep(mask,0,(1<