Submission #1063008

#TimeUsernameProblemLanguageResultExecution timeMemory
1063008belgianbotMatryoshka (JOI16_matryoshka)C++17
100 / 100
197 ms25328 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<pair<int,int>, null_type, less<pair<int,int>>, rb_tree_tag, tree_order_statistics_node_update>
#define fi first
#define se second
#define int long long

using namespace std;

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int N, Q; cin >> N >> Q;
	vector<pair<int,int>> a(N);
	vector<pair<pair<int,int>,int>> q(Q);
	vector<int> res(Q);
	for (int i = 0; i < N; i++) cin >> a[i].fi >> a[i].se;
	for (int i = 0; i < Q; i++) {cin >> q[i].fi.fi >> q[i].fi.se; q[i].se = i;}
	
	sort(a.rbegin(), a.rend());
	sort(q.rbegin(), q.rend());
	
	int j = 0, cnt = 0;
	ordered_set lis;
	for (int i = 0; i < Q; i++) {
		int ans = lis.order_of_key({q[i].fi.se + 1,-1});
		while (j < N && a[j].fi >= q[i].fi.fi) {
			vector<int> curr;
			int actual = a[j].fi;
			for (; j < N && a[j].fi == actual; j++) curr.push_back(a[j].se);
		
			for (int k = 0; k < curr.size(); k++) {
				auto up = lis.upper_bound({curr[k] + 1,-1});
				if (up == lis.end()) {
					if (curr[k] <= q[i].fi.se) ans++;
				}
				else {
					lis.erase(up);
					if ((*up).fi > q[i].fi.se && curr[k] <= q[i].fi.se) ans++;
				}
			}
			for (int k = 0; k < curr.size(); k++) lis.insert({curr[k], cnt++});
		}
		res[q[i].se] = ans;
	}
	
	for (int i = 0; i < Q; i++) cout << res[i] << '\n';
	return 0;
}
	
	

Compilation message (stderr)

matryoshka.cpp: In function 'int main()':
matryoshka.cpp:34:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |    for (int k = 0; k < curr.size(); k++) {
      |                    ~~^~~~~~~~~~~~~
matryoshka.cpp:44:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |    for (int k = 0; k < curr.size(); k++) lis.insert({curr[k], cnt++});
      |                    ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...