60pts求调
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 2e5 + 10;
const ll mod = 998244353;
// ans = -(a_l + ....+ a_r) ^ 2 + n(a_l ^ 2 + ....+ a_r ^ 2)
ll n,m,q,pre[M],pre1[M],pre2[M],L,R;
struct seq{
ll l,r;
ll val;
}a[M];
bool cmp(seq a,seq b)
{
return a.r < b.r;
}
int main(){
//freopen("sample1.in","r",stdin);
//freopen("ans.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> m >> q;
for(int i = 1;i <= m;i++){
cin >> a[i].l >> a[i].r >> a[i].val;
}
sort(a + 1,a + 1 + m,cmp);
for(int i = 1;i <= m;i++){
ll len = (a[i].r - a[i].l + 1) % mod;
a[i].val %= mod;
pre[i] = (pre[i - 1] + len) % mod;
pre1[i] = (pre1[i - 1] % mod + len * a[i].val % mod) % mod;
pre2[i] = (pre2[i - 1] % mod + a[i].val % mod * a[i].val % mod * len) % mod;
}
for(int i = 1;i <= q;i++){
cin >> L >> R;
ll l,r,pos1,pos2;
pos2 = lower_bound(pre + 1,pre + 1 + m,R) - (pre);
pos1 = lower_bound(pre + 1,pre + 1 + m,L) - (pre);
ll ans = 0,res1 = 0,res2 = 0;
if(pos1 == pos2){
cout << "0\n";
continue;
}
if(pre[pos1] == L){
res1 += a[pos1].val % mod;
res2 += a[pos1].val % mod * a[pos1].val % mod;
}
else{
ll id = (L - pre[pos1 - 1]) % mod;
ll len = (a[pos1].r - a[pos1].l + 1) % mod - id + 1;
res1 += len * a[pos1].val % mod;
res2 += len * a[pos1].val % mod * a[pos1].val % mod;
}
if(pre[pos2] == R){
ll len = (a[pos2].r - a[pos2].l + 1) % mod;
res1 += a[pos2].val * len % mod;
res2 += a[pos2].val % mod * a[pos2].val % mod * len % mod;
}
else{
ll id = (R - pre[pos2 - 1]) % mod;
res1 += a[pos2].val * id % mod;
res2 += a[pos2].val % mod * a[pos2].val % mod * id % mod;
}
if(pos2 - pos1 > 1){
res1 += (pre1[pos2 - 1] % mod - pre1[pos1] % mod + mod) % mod;
res2 += (pre2[pos2 - 1] % mod - pre2[pos1] % mod + mod) % mod;
}
res1 %= mod;
res2 %= mod;
ans = (-(res1 * res1 % mod) + ((R - L + 1) % mod * res2 % mod) + mod) % mod;
cout << (ans + mod) % mod << "\n";
}
return 0;
}