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)

#define ll long long
#define pb push_back
#include<bits/stdc++.h>
using namespace std;
struct qq{
	int id, d, fr, to;
	int stt;
};
const int N = 500000;
qq que[N];
int t, m, q, a, b, dd, k = 0;
vector<pair<int, int>> invals;
void addRange(int left, int right) {
        int n = invals.size();
        vector<pair<int, int>> tmp;
        for (int i = 0; i <= n; i++) {
            if (i == n || invals[i].first > right) {
                tmp.push_back({left, right});
                while (i < n) tmp.push_back(invals[i++]);
            }
            else if (invals[i].second < left) 
                tmp.push_back(invals[i]);
            else {
                left = min(left, invals[i].first);
                right = max(right, invals[i].second);
            }
        }
        swap(invals, tmp);
    }
    
    bool queryRange(int left, int right) {
        int n = invals.size(), l = 0, r = n-1;
        while (l <= r) {
            int m = l+(r-l)/2;
            if (invals[m].first >= right)
                r = m-1;
            else if (invals[m].second <= left)
                l = m+1;
            else 
                return invals[m].first <= left && invals[m].second >= right;
        }
        return false;
    }
bool cmp(qq a, qq b){
	if(a.d != b.d) return a.d < b.d;
	return a.id < b.id;
}
void solve(){
	invals.clear();
	k = 0;
	cin >> t >> m >> q;
	for(int i = 0; i < m ; i++){
		cin >> dd >> a >> b;
		que[k].id = 1; que[k].d = dd + 1; que[k].fr = a; que[k].to = b;
		k++;
	}
	for(int i = 0; i < q; i++){
		cin >> dd >> a >> b;
		que[k].id = 2; que[k].d = dd; que[k].fr = a; que[k].to = b;
		que[k].stt = i;
		k++;
	}
	sort(que, que + k, cmp);
	bool ans[q]; memset(ans, 0, sizeof ans);
	for(int i = 0; i < k; i++){
		if(que[i].id == 1){
			addRange(que[i].fr, que[i].to);
		}else{
			if(queryRange(que[i].fr, que[i].to) || que[i].fr >= que[i].to){
				ans[que[i].stt] = true;
			}else ans[que[i].stt] = false;
		}
	}
	for(int i = 0; i < q; i++){
		if(ans[i]) printf("Yes\n");
		else printf("No\n");
	}
}
int main(){
	solve();
	return 0;
}