RT 背包思路,细节也判了,可能是背包写的不对...
#include<bits/stdc++.h>
#define cn getchar
#define pt putchar
inline void in(int &x){
x=0;int f1=1;char ch=cn();
while(ch<'0'||ch>'9'){if(ch=='-')f1=-1;ch=cn();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-48;ch=cn();}
x*=f1;
}
inline void out(int x){
if(x<0){x=~(x-1);pt('-');}if(x>9)out(x/10);pt(x%10+48);
}
using namespace std;
int n,m,k;
int x[10001],y[10001];
struct line{
int p,l,h;
}t[10001];
int f[2][1011];
inline bool cmp(const line &a,const line &b){
return a.p<b.p;
}
int main(){in(n);in(m);in(k);
for(int i=1;i<=n;i++)in(x[i]),in(y[i]);
for(int i=1;i<=k;i++)in(t[i].p),in(t[i].l),in(t[i].h);
sort(t+1,t+1+k,cmp);
for(int i=1;i<=m;i++)f[0&1][i]=0;int now=1,res=0;
for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)f[i&1][j]=1e9;
for(int j=x[i]+1;j<=m;j++)if(f[(i-1)&1][j-x[i]]!=1e9)f[i&1][j]=min(f[i&1][j],f[(i-1)&1][j-x[i]]+1);
for(int j=x[i]+1;j<=m;j++){
if(f[i&1][j-x[i]]!=1e9&&f[i&1][j-x[i]]+1<f[i&1][j])f[i&1][j]=f[i&1][j-x[i]]+1;
}
for(int j=1;j<=m-y[i];j++)if(f[(i-1)&1][j+y[i]]!=1e9)f[i&1][j]=min(f[i&1][j],f[(i-1)&1][j+y[i]]);
for(int j=m;j>=m-x[i];j--){
if(f[(i-1)&1][j]!=1e9&&f[(i-1)&1][j]+1<f[i&1][m])f[i&1][m]=f[(i-1)&1][j]+1;
}
if(i==t[now].p&&now<=k){bool bk=false;
for(int j=t[now].l+1;j<t[now].h;j++){
if(f[i&1][j]!=1e9){bk=true;++res;break;}
}
if(!bk){
puts("0");out(res);return 0;
}
for(int j=1;j<=t[now].l;j++)f[i&1][j]=1e9;
for(int j=t[now].h;j<=m;j++)f[i&1][j]=1e9;
now++;
}bool bk=false;
for(int j=1;j<=m;j++){
if(f[i&1][j]!=1e9)bk=true;
}if(!bk){
puts("0");out(res);return 0;
}
// for(int j=1;j<=m;j++){
// printf("%d ",f[i&1][j]);
// }puts("");
}puts("1");int minn=1e9;
for(int i=1;i<=m;i++)if(f[n&1][i]!=1e9)minn=min(minn,f[n&1][i]);out(minn);
return 0;
}