鸟可能在高度已经到达m时顶格跳从而防止下降。
#include<bits/stdc++.h>
#define inf 10000000
using namespace std;
const int MXN = 1000010;
int n,m,k,ans=inf,pans;
int f[MXN],g[MXN];
struct point
{
int u,d,l,r,s;
}a[MXN];
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
a[i].l=1;a[i].r=m;
scanf("%d%d",&a[i].u,&a[i].d);
}
for(int i=1;i<=k;i++)
{
int p,l,r;
scanf("%d%d%d",&p,&l,&r);
a[p].l=max(a[p].l,l+1);
a[p].r=min(a[p].r,r-1);
a[p].s=1;
}
for(int i=1;i<=n;i++)
{
a[i].s+=a[i-1].s;
}
f[0]=g[0]=inf;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++) g[j]=inf;
for(int j=a[i].u+1;j<=a[i].r;j++)
{
g[j]=min(g[j-a[i].u],f[j-a[i].u])+1;
}
if(a[i].r==m) for(int j=max(m-a[i].u+1,1);j<m;j++)//将j<m改为j<=m即可通过
{
g[m]=min(min(g[j],f[j])+1,g[m]);
}
for(int j=a[i].l;j<=a[i].r;j++)
{
if(j+a[i].d<=m) g[j]=min(g[j],f[j+a[i].d]);
}
for(int j=1;j<=m;j++)
{
f[j]=inf;
if(j>=a[i].l&&j<=a[i].r&&g[j]<inf)
{
if(i==n) ans=min(ans,g[j]);
pans=a[i].s;f[j]=g[j];
}
// cout<<f[j]<<" ";
}
// cout<<endl;
}
cout<<(ans<inf)<<endl<<(ans<inf?ans:pans);
return 0;
}