// ~~ icebear ~~
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
template<class T>
bool minimize(T &a, const T &b) {
if (a > b) return a = b, true;
return false;
}
template<class T>
bool maximize(T &a, const T &b) {
if (a < b) return a = b, true;
return false;
}
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define FORR(i,a,b) for(int i=(a); i>=(b); --i)
#define REP(i, n) for(int i=0; i<(n); ++i)
#define RED(i, n) for(int i=(n)-1; i>=0; --i)
#define MASK(i) (1LL << (i))
#define BIT(S, i) (((S) >> (i)) & 1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define task "icebear"
const int MOD = 1e9 + 7;
const int inf = 1e9 + 27092008;
const ll INF = 1e18 + 27092008;
const int N = 3e5 + 5;
int numShop, numQuery, numType;
array<int, 4> shop[N];
vector<int> com_pos, com_year;
struct Event {
int year, pos, type, id;
Event(int _year = 0, int _pos = 0, int _type = 0, int _id = 0):
year(_year), pos(_pos), type(_type), id(_id) {}
bool operator < (const Event &other) const {
if (year == other.year) return id < other.id;
return year < other.year;
}
};
vector<Event> events;
struct SegmentTree {
multiset<int> node[N << 2];
vector<int> com_pos;
int sizeTree;
void init(vector<int> &com) {
sizeTree = (int)com.size();
com_pos = com;
}
void add(int id, int l, int r, int u, int v, int val) {
if (l > v || r < u) return;
if (u <= l && r <= v) {
node[id].insert(val);
return;
}
int mid = (l + r) >> 1;
add(id << 1, l, mid, u, v, val);
add(id << 1 | 1, mid + 1, r, u, v, val);
}
void del(int id, int l, int r, int u, int v, int val) {
if (l > v || r < u) return;
if (u <= l && r <= v) {
if (node[id].find(val) == node[id].end()) {
cerr << "WANT TO DEL : " << com_pos[u - 1] << ' ' << com_pos[v - 1] << ' ' << val << '\n';
assert(false);
}
node[id].erase(node[id].find(val));
return;
}
int mid = (l + r) >> 1;
del(id << 1, l, mid, u, v, val);
del(id << 1 | 1, mid + 1, r, u, v, val);
}
void add(int u, int v, int val) {
u = lower_bound(all(com_pos), u) - com_pos.begin() + 1;
v = upper_bound(all(com_pos), v) - com_pos.begin();
if (u > v) return;
add(1, 1, sizeTree, u, v, val);
}
void del(int u, int v, int val) {
u = lower_bound(all(com_pos), u) - com_pos.begin() + 1;
v = upper_bound(all(com_pos), v) - com_pos.begin();
if (u > v) return;
del(1, 1, sizeTree, u, v, val);
}
int getAns(int pos) {
int ans = 0;
int id = 1, l = 1, r = sizeTree;
int com = upper_bound(all(com_pos), pos) - com_pos.begin();
while(true) {
if (!node[id].empty()) {
maximize(ans, abs(pos - *node[id].begin()));
maximize(ans, abs(pos - *node[id].rbegin()));
}
if (l == r) break;
int mid = (l + r) >> 1;
if (com > mid) id = (id << 1 | 1), l = mid + 1;
else id = (id << 1), r = mid;
}
return ans;
}
} IT;
int ans[N], cur_cnt;
multiset<int> pos_shop[N];
void add_shop(int pos, int type) {
if (pos_shop[type].find(pos) != pos_shop[type].end()) {
pos_shop[type].insert(pos);
return;
}
if (pos_shop[type].empty()) cur_cnt++;
auto it = pos_shop[type].lower_bound(pos);
int l = -1, r = -1;
if (it != pos_shop[type].end()) r = *it;
if (it != pos_shop[type].begin()) l = *(--it);
if (l != -1 || r != -1) {
// cerr << "DELETE AT TYPE " << type << " : " << l << ' ' << pos << ' ' << r << '\n';
if (l == -1) IT.del(1, r, r);
else if (r == -1) IT.del(l, inf, l);
else {
int mid = (l + r) >> 1;
IT.del(l, mid, l);
IT.del(mid + 1, r, r);
}
}
if (l == -1) IT.add(1, pos, pos);
else {
int mid = (l + pos) >> 1;
IT.add(l, mid, l);
IT.add(mid + 1, pos, pos);
}
if (r == -1) IT.add(pos, inf, pos);
else {
int mid = (pos + r) >> 1;
IT.add(pos, mid, pos);
IT.add(mid + 1, r, r);
}
pos_shop[type].insert(pos);
}
void del_shop(int pos, int type) {
pos_shop[type].erase(pos_shop[type].find(pos));
if (pos_shop[type].find(pos) != pos_shop[type].end()) return;
if (pos_shop[type].empty()) cur_cnt--;
auto it = pos_shop[type].upper_bound(pos);
int l = -1, r = -1;
if (it != pos_shop[type].end()) r = *it;
if (it != pos_shop[type].begin()) l = *(--it);
if (l == -1) IT.del(1, pos, pos);
else {
int mid = (l + pos) >> 1;
IT.del(l, mid, l);
IT.del(mid + 1, pos, pos);
}
if (r == -1) IT.del(pos, inf, pos);
else {
int mid = (pos + r) >> 1;
IT.del(pos, mid, pos);
IT.del(mid + 1, r, r);
}
if (l != -1 || r != -1) {
if (l == -1) IT.add(1, r, r);
else if (r == -1) IT.add(l, inf, l);
else {
int mid = (l + r) >> 1;
IT.add(l, mid, l);
IT.add(mid + 1, r, r);
}
}
}
void query(int pos, int id) {
if (cur_cnt < numType) ans[id] = -1;
else ans[id] = IT.getAns(pos);
}
void init(void) {
cin >> numShop >> numType >> numQuery;
FOR(i, 1, numShop) {
REP(j, 4) cin >> shop[i][j];
com_pos.pb(shop[i][0]);
events.emplace_back(shop[i][2], shop[i][0], shop[i][1], -1);
events.emplace_back(shop[i][3], shop[i][0], shop[i][1], inf);
}
FOR(i, 1, numQuery) {
int pos, year;
cin >> pos >> year;
com_pos.pb(pos);
events.emplace_back(year, pos, -1, i);
}
}
void process(void) {
com_pos.pb(1); com_pos.pb(inf);
sort(all(com_pos));
com_pos.resize(unique(all(com_pos)) - com_pos.begin());
IT.init(com_pos);
sort(all(events));
for(auto &e : events) {
if (e.id < 0) add_shop(e.pos, e.type);
else if (e.id == inf) del_shop(e.pos, e.type);
else query(e.pos, e.id);
}
FOR(i, 1, numQuery) cout << ans[i] << '\n';
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
int tc = 1;
// cin >> tc;
while(tc--) {
init();
process();
}
return 0;
}
Compilation message (stderr)
new_home.cpp: In function 'int main()':
new_home.cpp:240:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
240 | freopen(task".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:241:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
241 | freopen(task".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |