Files
contests/2023/rcpc/d2/editorial/l-dush-682.cpp
2024-04-22 16:45:09 +03:00

89 lines
2.0 KiB
C++

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int inf = 1e18;
int n,m;
int tip[25],a[25];
int s[100005],d[100005],t[100005];
int dp[(1 << 20) + 5];///timpul minim la care mask isi fac dus
vector<pair<int,int>>interv[3];
int topt[25][100005];
void prec()
{
for (int om = 0; om < n; om++)
{
int tp = tip[om];
int lg = a[om];
topt[om][interv[tp].size()] = inf;
for (int i = interv[tp].size() - 1; i >= 0; i--)
{
topt[om][i] = topt[om][i + 1];
if (interv[tp][i].second >= lg)
topt[om][i] = interv[tp][i].first + lg;
}
}
}
int f(int ti,int om)
{
if (ti == inf)
return inf;
int st = -1,pas = 1 << 16;
while (pas != 0)
{
if (st + pas < interv[tip[om]].size() and interv[tip[om]][st + pas].first <= ti)
st += pas;
pas /= 2;
}
///st este ultimul interval cu s <= ti
int timp = inf;
if (st != -1)
{
if (interv[tip[om]][st].first + interv[tip[om]][st].second - ti >= a[om])
timp = ti + a[om];
}
if (timp == inf and st + 1 != interv[tip[om]].size())
{
timp = topt[om][st + 1];
}
//cout << ti << ' ' << om << ' ' << timp << '\n';
return timp;
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> tip[i] >> a[i],tip[i]++;
for (int i = 1; i <= m; i++)
{
cin >> s[i] >> d[i] >> t[i],t[i]++;
interv[t[i]].push_back({s[i],d[i]});
}
prec();
for (int mask = 1; mask < (1 << n); mask++)
{
int minim = inf;
for (int bit = 0; bit < n; bit++)
{
if ((mask & (1 << bit)) != 0)
{
int tant = dp[mask - (1 << bit)];
minim = min(minim,f(tant,bit));
}
}
dp[mask] = minim;
//cout << dp[mask] << '\n';
}
cout << dp[(1 << n) - 1];
return 0;
}