Problem:
G: エレベータ

問題

株式会社AORは $N$ 階建てのビルである。地下階は存在しない。

AORイカちゃんはイカであるため、階段を下りることは可能だが、上ることは不可能である。

上の階に登れないと不便なため、$M$ 個のエレベータをビルに設置することにした。

エレベータを設置するには時間がかかり、$i$ 番目のエレベータは $D_i$ 日後の夜に設置が完了し、 $A_i$ 階以上 $B_i$ 階以下の全ての階を移動可能にする。

あなたはAORイカちゃんに $Q$ 個の質問をされた。$i$ 番目の質問は「 $E_i$ 日後の昼に、$S_i$ 階から $T_i$ 階に移動可能か？」という質問である。

移動に使える手段は階段とエレベータのみである。また移動にかかる時間は無視できるものとする。

制約

$2 \le N \le 10^5$

$1 \le M \le 10^5$

$1 \le Q \le 10^5$

$1 \le D_i , E_i \le 10^9$

$1 \le A_i < B_i \le N$

$1 \le S_i , T_i \le N$

入力は全て整数

入力

$N \ M\ Q$

$D_1 \ A_1 \ B_1$

$\vdots$

$D_M \ A_M \ B_M$

$E_1 \ S_1 \ T_1$

$\vdots$

$E_Q \ S_Q \ T_Q$

出力

各質問ごとに一行で Yes または No を出力せよ。ただし質問された順に答えること。また末尾に改行を出力せよ。

サンプル

サンプル入力 1

5 1 2
3 1 5
3 1 5
4 1 5

サンプル出力 1

No
Yes

エレベータが設置されるのは三日目の夜であるため、三日目の昼に移動することはできない。

サンプル入力 2

8 6 5
30 6 7
21 3 8
5 2 4
10 1 2
2 7 8
15 5 7
16 5 8
11 1 3
22 3 7
30 6 7
15 5 8

サンプル出力 2

Yes
Yes
Yes
Yes
No

Solution in C++14 (judge verdict: Time Limit Exceeded)

#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <numeric>
#include <utility>
#include <iomanip>
#include <algorithm>
#include <functional>
#include <unordered_map>
using namespace std;

#define REP(i, s) for (int i = 0; i < s; ++i)
#define ALL(v) (v.begin(), v.end())
#define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl
#define EACH(i, s) for (__typeof__((s).begin()) i = (s).begin(); i != (s).end(); ++i)

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
template<class T1, class T2> ostream& operator << (ostream &s, pair<T1,T2> P)
{ return s << '<' << P.first << ", " << P.second << '>'; }
template<class T> ostream& operator << (ostream &s, vector<T> P)
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, vector<vector<T> > P)
{ for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; }
template<class T> ostream& operator << (ostream &s, set<T> P)
{ EACH(it, P) { s << "<" << *it << "> "; } return s << endl; }
template<class T1, class T2> ostream& operator << (ostream &s, map<T1,T2> P)
{ EACH(it, P) { s << "<" << it->first << "->" << it->second << "> "; } return s << endl; }




const int MAX_UF = 210000;
struct UnionFind {
	int size_uf;
	int par[MAX_UF];
	int rank[MAX_UF];
	int size_component[MAX_UF];

	UnionFind(int n = 0) { size_uf = n; for (int i = 0; i < n; ++i) par[i] = i, rank[i] = 0, size_component[i] = 1; }
	void init(int n) { size_uf = n; for (int i = 0; i < n; ++i) par[i] = i, rank[i] = 0, size_component[i] = 1; }
	int root(int x) { return par[x] == x ? x : par[x] = root(par[x]); }
	bool issame(int x, int y) { return root(x) == root(y); }
	int size(int x) { return size_component[root(x)]; }

	void connect(int x, int y) {
		x = root(x), y = root(y);
		int sx = size_component[x], sy = size_component[y];
		if (x == y) return;
		int r;
		if (rank[x] < rank[y]) par[x] = y, r = y;
		else { par[y] = x, r = x; if (rank[x] == rank[y]) ++rank[x]; }
		size_component[r] = sx + sy;
	}

	friend ostream& operator << (ostream& s, UnionFind uf) {
		map<int, vector<int> > res;
		for (int i = 0; i < uf.size_uf; ++i) {
			int r = uf.root(i);
			res[r].push_back(i);
		}
		for (map<int, vector<int> >::iterator it = res.begin(); it != res.end(); ++it) {
			s << it->second << endl;
		}
		return s;
	}
} uf;



typedef pair<int,int> pint;


int N, M, Q;
vector<pair<int,pint> > el;
vector<pair<pair<int,pint>, int> > qu;
vector<string> res;

int main() {
  while (cin >> N >> M >> Q) {
	el.clear();
	qu.clear();
	res.clear();
	res.resize(Q);

	for (int i = 0; i < M; ++i) {
	  int d, a, b;
	  cin >> d >> a >> b;
	  --a, --b;
	  el.push_back(make_pair(d, pint(a, b)) );
	}
	for (int q = 0; q < Q; ++q) {
	  int e, s, t;
	  cin >> e >> s >> t;
	  --s, --t;
	  qu.push_back(make_pair( make_pair(e, pint(s, t)), q) );
	}

	sort(el.begin(), el.end());
	sort(qu.begin(), qu.end());

	
	//COUT(el); COUT(qu);
	uf.init(N);
    set<int> se;
	for (int i = 0; i < N; ++i) se.insert(i);
	
	int j = 0;
	for (int i = 0; i < qu.size(); ++i) {
	  int e = qu[i].first.first;
	  int s = qu[i].first.second.first;
	  int t = qu[i].first.second.second;
	  int q = qu[i].second;

	  if (t <= s) {
		res[q] = "Yes";
		continue;
	  }

	  for (; j < el.size(); ++j) {
		int d = el[j].first;
		int a = el[j].second.first;
		int b = el[j].second.second;
		if (d >= e) {
		  break;
		}

		/*
		COUT(j);
		COUT(d);
		COUT(a);
		COUT(b);
		*/

		while (true) {
		  set<int>::iterator it = lower_bound(se.begin(), se.end(), a);
		  if (*it >= b) break;
		  uf.connect(*it, b);
		  se.erase(*it);
		}


		//COUT(se);
	  }

	  if (uf.issame(s, t)) res[q] = "Yes";
	  else res[q] = "No";

	}

	for (int q = 0; q < Q; ++q) {
	  cout << res[q] << endl;
	}
  }
}