记录
#include <bits/stdc++.h>
#define IT set<Node>::iterator
#define ls now*2
#define rs now*2+1
using namespace std;
const long long mod=998244353;
int n,m,x,lmin=0x3f3f3f3f,rmax=-0x3f3f3f3f;
struct Line
{
int l,r,h;
bool operator < (const Line &ano) const
{
return h>ano.h;
}
} line[500005];
struct Node
{
int l,r;
mutable long long v;
Node(int L,int R=-1,long long V=0) : l(L),r(R),v(V) {}
bool operator < (const Node &ano) const
{
return l<ano.l;
}
};
set<Node> s;
IT split(int pos)
{
IT it=s.lower_bound(Node(pos));
if(it!=s.end() && it->l==pos)
{
return it;
}
it--;
int L=it->l,R=it->r;
long long V=it->v;
s.erase(it);
s.insert(Node(L,pos-1,V));
return s.insert(Node(pos,R,V)).first;
}
void assign(int l,int r,long long k)
{
IT itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(Node(l,r,k%mod));
}
void updata(int x,long long k)
{
IT itr=split(x+1),itl=split(x);
itl->v+=k;
itl->v%=mod;
}
long long query(int l,int r)
{
long long ans=0;
IT itr=split(r+1),itl=split(l);
for(;itl!=itr;itl++)
{
ans=(ans+itl->v*(itl->r-itl->l+1))%mod;
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>line[i].l>>line[i].r>>line[i].h;
lmin=min(lmin,line[i].l),rmax=max(rmax,line[i].r);
}
sort(line+1,line+n+1);
s.insert(Node(0,100005));
for(int i=1;i<=m;i++)
{
cin>>x;
lmin=min(lmin,x),rmax=max(rmax,x);
updata(x,1);
}
for(int i=1;i<=n;i++)
{
long long sum=query(line[i].l,line[i].r)%mod;
assign(line[i].l,line[i].r,0);
updata(line[i].l,sum);
updata(line[i].r,sum);
}
cout<<query(0,100005)%mod;
return 0;
}