RT,第一个点 WA。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define lc(x) x<<1
#define rc(x) x<<1|1
const int maxn = 100000;
const int mo = 998244353;
int n, m, ans, x, f[500010], d[2000010], tag[2000010];
struct node{
int l, r, h;
bool operator < (const node &A) const{
if (h == A.h) return l < A.l;
return h < A.h;
}
}a[500010];
void pushdown(int k){
if (tag[k]){
d[lc(k)] = tag[k];
d[rc(k)] = tag[k];
tag[lc(k)] = tag[k];
tag[rc(k)] = tag[k];
tag[k] = 0;
}
}
void modify(int k, int l, int r, int x, int y, int p){
if (x <= l && r <= y){
d[k] = p;
tag[k] = p;
return ;
}
int mid = l + r >> 1;
pushdown(k);
if (x <= mid) modify(lc(k), l, mid, x, y, p);
if (y > mid) modify(rc(k), mid+1, r, x, y, p);
}
int query(int k, int l, int r, int x){
if (l == r) return d[k];
int mid = l + r >> 1, ret = 0;
pushdown(k);
if (x <= mid) ret = query(lc(k), l, mid, x);
else ret = query(rc(k), mid+1, r, x);
return ret;
}
signed main(){
scanf ("%lld%lld", &n, &m);
for (int i=1; i<=m; i++){
scanf ("%lld%lld%lld", &a[i].l, &a[i].r, &a[i].h);
}
sort (a+1, a+m+1);
for (int i=1; i<=m; i++){
int L = a[i].l, R = a[i].r;
int ql = query(1, 0, maxn, L), qr = query(1, 0, maxn, R);
if (ql == 0 && qr == 0) f[i] = 2;
else if (ql == 0 || qr == 0) f[i] = (f[ql] + f[qr] + 1) % mo;
else f[i] = (f[ql] + f[qr]) % mo;
modify(1, 0, maxn, L, R, i);
}
for (int i=1; i<=n; i++){
scanf ("%lld", &x);
ans += f[query(1, 0, maxn, x)];
ans %= mo;
}
printf ("%lld\n", ans);
return 0;
}