#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) x.begin(), x.end()
#define pf push_front
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define sz(x) (int)x.size()
#define f first
#define s second
#define mod 1000000007
// const int mod = 998244353;
// OVERFLOW!!!!!!!!!!!!!!!!!!

struct Node
{
   vector<int> prefix;
   vector<pair<ll, int>> lista;
};

const int maxn = 2e5 + 100;
vector<Node> st(4 * maxn);
vector<pair<int, int>> vp(maxn);
void build(int v, int tl, int tr)
{
   if (tl == tr)
   {
      st[v].lista.pb({-1e18, 1});
      st[v].lista.pb({vp[tl].f, 1});
      st[v].lista.pb({vp[tl].s + 1, -1});
      st[v].lista.pb({1e18, 1});
      st[v].prefix.pb(0);
      st[v].prefix.pb(1);
      st[v].prefix.pb(0);
      st[v].prefix.pb(0);
   }
   else
   {
      int mid = tl + (tr - tl) / 2;
      build(v * 2, tl, mid);
      build(v * 2 + 1, mid + 1, tr);
      int i = 1, j = 1;
      st[v].lista.pb({-1e18, 1});
      while (i < sz(st[v * 2].lista) - 1 && j < sz(st[v * 2 + 1].lista) - 1)
      {
         if (st[v * 2].lista[i].f <= st[v * 2 + 1].lista[j].f)
         {
            st[v].lista.pb({st[v * 2].lista[i].f, st[v * 2].lista[i].s});
            ++i;
         }
         else
         {
            st[v].lista.pb({st[v * 2 + 1].lista[j].f, st[v * 2 + 1].lista[j].s});
            ++j;
         }
      }
      while (i < sz(st[v * 2].lista) - 1)
      {
         st[v].lista.pb({st[v * 2].lista[i].f, st[v * 2].lista[i].s});
         ++i;
      }
      while (j < sz(st[v * 2 + 1].lista) - 1)
      {
         st[v].lista.pb({st[v * 2 + 1].lista[j].f, st[v * 2 + 1].lista[j].s});
         ++j;
      }
      st[v].lista.pb({1e18, -1});
      int x = st[v].lista[1].s;
      st[v].prefix.pb(0);
      st[v].prefix.pb(x);
      for (int i = 2; i < sz(st[v].lista) - 1; i++)
      {
         x += st[v].lista[i].s;
         st[v].prefix.pb(x);
      }
      st[v].prefix.pb(0);
   }
}

int qry(int v, int tl, int tr, int l, int r, int x)
{
   if (tl > r || tr < l)
      return 0;
   if (tl >= l && tr <= r)
   {
      int lmao = 0, lmao1 = sz(st[v].lista) - 1, rez = sz(st[v].lista);
      while (lmao <= lmao1)
      {
         int z = lmao + (lmao1 - lmao) / 2;
         if (st[v].lista[z].f > x)
            lmao1 = z - 1;
         else
         {
            rez = z;
            lmao = z + 1;
         }
      }
      return st[v].prefix[rez];
   }
   else
   {
      int mid = tl + (tr - tl) / 2;
      return qry(v * 2, tl, mid, l, r, x) + qry(v * 2 + 1, mid + 1, tr, l, r, x);
   }
}

int main()
{
   ios_base::sync_with_stdio(false);
   cout.tie(nullptr);
   cin.tie(nullptr);
   int n, q;
   cin >> n >> q;
   for (int i = 1; i <= n; i++)
      cin >> vp[i].f >> vp[i].s;
   build(1, 1, n);
   while (q--)
   {
      int l, r, x;
      cin >> l >> r >> x;
      cout << qry(1, 1, n, l, r, x) << "\n";
   }
   return 0;
}