93 lines
2.1 KiB
C++
93 lines
2.1 KiB
C++
#include <cstdio>
|
|
#include <algorithm>
|
|
#include <cassert>
|
|
#define NRINT (100'000 + 5)
|
|
|
|
using namespace std;
|
|
|
|
struct interval
|
|
{
|
|
int apa, timpapa, inceput;
|
|
};
|
|
|
|
struct preferinte
|
|
{
|
|
int apa, timpdus;
|
|
};
|
|
|
|
int tmin[1500000];
|
|
int tnext[21][NRINT];
|
|
int nrinterv[21];
|
|
interval dus[NRINT];
|
|
preferinte om[21];
|
|
int log2[1500000];
|
|
|
|
inline int lsb(int val)
|
|
{
|
|
return val&(-val);
|
|
}
|
|
|
|
int bs(int val, int pers)
|
|
{
|
|
int st, dr, mid, last;
|
|
st = 0;
|
|
dr = nrinterv[pers];
|
|
while(st <= dr)
|
|
{
|
|
mid = (st + dr) / 2;
|
|
if(dus[tnext[pers][mid]].inceput > val)
|
|
dr = mid - 1;
|
|
else
|
|
{
|
|
last = mid;
|
|
st = mid + 1;
|
|
}
|
|
}
|
|
return last;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
// freopen("dush.in", "r", stdin);
|
|
// freopen("dush.out", "w", stdout);
|
|
|
|
int n, m, i, j, missing, pozc, nex;
|
|
scanf("%d%d", &n, &m);
|
|
for(i = 1; i <= n; ++ i)
|
|
scanf("%d%d", &om[i].apa, &om[i].timpdus);
|
|
for(i = 1; i <= m; ++ i)
|
|
scanf("%d%d%d", &dus[i].inceput, &dus[i].timpapa, &dus[i].apa);
|
|
for(i = 1; i <= m; ++ i)
|
|
{
|
|
for(j = 1; j <= n; ++ j)
|
|
if(dus[i].apa == om[j].apa && dus[i].timpapa >= om[j].timpdus)
|
|
tnext[j][++ nrinterv[j]] = i;
|
|
}
|
|
for(i = 1; i < 1500000; ++ i)
|
|
tmin[i] = 2000000000;
|
|
for(i = 2; i <= (1 << n); ++ i)
|
|
log2[i] = log2[i/2] + 1;
|
|
for(i = 0; i < (1 << n); ++ i)
|
|
{
|
|
missing = ((1 << n) - 1) ^ i;
|
|
while(missing)
|
|
{
|
|
nex = lsb(missing);
|
|
j = log2[nex] + 1;
|
|
pozc = bs(tmin[i], j);
|
|
if(pozc > 0)
|
|
if(dus[tnext[j][pozc]].inceput + dus[tnext[j][pozc]].timpapa >= tmin[i] + om[j].timpdus)
|
|
if(tmin[i] + om[j].timpdus < tmin[i ^ nex])
|
|
tmin[i ^ nex] = tmin[i] + om[j].timpdus;
|
|
if(pozc < nrinterv[j])
|
|
if(tmin[i ^ nex] > dus[tnext[j][pozc + 1]].inceput + om[j].timpdus)
|
|
tmin[i ^ nex] = dus[tnext[j][pozc + 1]].inceput + om[j].timpdus;
|
|
missing ^= nex;
|
|
}
|
|
}
|
|
printf("%d", tmin[(1 << n) - 1]);
|
|
|
|
assert(tmin[(1 << n) - 1] < 2'000'000'000);
|
|
return 0;
|
|
}
|