Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 600007
- using namespace std;
- typedef pair<int, int> pii;
- typedef long long ll;
- int maior[4*MAX], idx[4*MAX], acum[4*MAX];
- struct rect{
- int x;
- int ini, end;
- int type;
- rect(int _x, int _ini, int _end, int _type): x(_x), ini(_ini), end(_end), type(_type) {}
- };
- bool compare(rect a, rect b){
- if(a.x == b.x) return a.type < b.type;
- return a.x < b.x;
- }
- void build(int id, int l, int r){
- if(l == r) idx[id] = l;
- else{
- int mid = (l+r)/2;
- build(2*id, l, mid);
- build(2*id+1, mid+1, r);
- idx[id] = (maior[id] == maior[2*id]) ? idx[2*id]:idx[2*id+1];
- }
- }
- void add(int id, int val){
- maior[id] += val;
- acum[id] += val;
- }
- void update(int id, int l, int r, int x, int y, int val){
- if(r < x || y < l) return;
- else if(x <= l && r <= y) add(id, val);
- else{
- int mid = (l+r)/2;
- add(2*id, acum[id]);
- add(2*id+1, acum[id]);
- acum[id] = 0;
- update(2*id, l, mid, x, y, val);
- update(2*id+1, mid+1, r, x, y, val);
- maior[id] = max(maior[2*id], maior[2*id+1]);
- idx[id] = (maior[id] == maior[2*id]) ? idx[2*id]:idx[2*id+1];
- }
- }
- // val - index
- pii query(int id, int l, int r, int x, int y){
- if(r < x || y < l) return make_pair(0, 0);
- else if(x <= l && r <= y) return make_pair(maior[id], idx[id]);
- else{
- int mid = (l+r)/2;
- add(2*id, acum[id]);
- add(2*id+1, acum[id]);
- acum[id] = 0;
- return max(query(2*id, l, mid, x, y),
- query(2*id+1, mid+1, r, x, y));
- }
- }
- void print(int sz){
- for(int i = 1; i <= 4*sz; i++) cout << idx[i] << " \n"[i == 4*sz];
- for(int i = 1; i <= 4*sz; i++) cout << maior[i] << " \n"[i == 4*sz];
- }
- map<ll, int> compress, descompress;
- vector<ll> vals;
- vector<rect> arr;
- int main(){
- int n; scanf("%d", &n);
- for(int i = 0; i < n; i++){
- ll x1, y1, x2, y2; scanf("%lld %lld %lld %lld", &x1, &y1, &x2, &y2);
- arr.emplace_back(x1, y1, y2, 0);
- arr.emplace_back(x2, y1, y2, 1);
- vals.push_back(x1);
- vals.push_back(x2);
- vals.push_back(y1);
- vals.push_back(y2);
- }
- sort(vals.begin(), vals.end());
- sort(arr.begin(), arr.end(), compare);
- int cnt = 0;
- for(int i = 0; i < vals.size(); i++) {
- if(!compress.count(vals[i])) {
- compress[vals[i]] = cnt;
- descompress[cnt++] = vals[i];
- }
- }
- pii ans = make_pair(-1, -1);
- build(1, 0, cnt);
- //print(cnt);
- for(int i = 0; i < arr.size(); i++){
- rect atual = arr[i];
- //cout << atual.x << " (" << atual.ini << ", " << atual.end << ") #" << atual.type << endl;
- //cout << "virou -> " << atual.x << " (" << compress[atual.ini] << ", " << compress[atual.end] << ") #" << atual.type << endl;
- if(atual.type == 0) {
- update(1, 0, cnt, compress[atual.ini], compress[atual.end], 1);
- //print(cnt);
- pii encontro = query(1, 0, cnt, 0, cnt);
- if(encontro.first >= n-1) {
- //cout << "#" << encontro.first << " " << encontro.second << endl;
- ans = make_pair(atual.x, descompress[encontro.second]);
- break;
- }
- }else update(1, 0, cnt, compress[atual.ini], compress[atual.end], -1);
- //cout << query(1, 1, cnt, 1, cnt).first << " " << query(1, 1, cnt, 1, cnt).second << endl;
- }
- printf("%d %d\n", ans.first, ans.second);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement