#include #include #include #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; }