#include <set>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 1012345678;
class segment {
public:
int l, r, x;
segment() : l(0), r(0), x(0) {};
segment(int l_, int r_, int x_) : l(l_), r(r_), x(x_) {};
bool operator<(const segment& s) const {
if(l != s.l) return l < s.l;
if(r != s.r) return r < s.r;
return x < s.x;
}
};
class query {
public:
int l, r, x, w;
query() : l(0), r(0), x(0), w(0) {};
query(int l_, int r_, int x_, int w_) : l(l_), r(r_), x(x_), w(w_) {};
bool operator<(const query& q) const {
return x < q.x;
}
};
class segtree {
private:
int sz;
vector<int> val;
public:
segtree() : sz(0), val(vector<int>()) {};
segtree(int sz_) {
sz = 1;
while(sz < sz_) sz *= 2;
val = vector<int>(sz * 2, -inf);
}
void update(int l, int r, int x) {
l += sz;
r += sz;
while(l != r) {
if(l & 1) val[l] = max(val[l], x), ++l;
if(r & 1) --r, val[r] = max(val[r], x);
l >>= 1, r >>= 1;
}
}
int get(int pos) {
pos += sz;
int ans = -inf;
while(pos >= 1) {
ans = max(ans, val[pos]);
pos >>= 1;
}
return ans;
}
};
int main() {
int N, K, Q;
cin >> N >> K >> Q;
vector<int> X(N), T(N), A(N), B(N);
vector<int> comp = { 0, inf };
vector<vector<int> > G(K);
for(int i = 0; i < N; ++i) {
cin >> X[i] >> T[i] >> A[i] >> B[i]; ++B[i], --T[i];
comp.push_back(A[i]);
comp.push_back(B[i]);
X[i] *= 2;
G[T[i]].push_back(i);
}
vector<int> L(Q), Y(Q);
for(int i = 0; i < Q; ++i) {
cin >> L[i] >> Y[i];
L[i] *= 2;
}
sort(comp.begin(), comp.end());
comp.erase(unique(comp.begin(), comp.end()), comp.end());
int S = comp.size();
for(int i = 0; i < N; ++i) {
A[i] = lower_bound(comp.begin(), comp.end(), A[i]) - comp.begin();
B[i] = lower_bound(comp.begin(), comp.end(), B[i]) - comp.begin();
}
for(int i = 0; i < Q; ++i) {
Y[i] = lower_bound(comp.begin(), comp.end(), Y[i] + 1) - comp.begin() - 1;
}
vector<query> qs;
for(int i = 0; i < K; ++i) {
set<segment> st;
st.insert(segment(0, S, -inf));
vector<segment> iniqs;
for(int j : G[i]) {
iniqs.push_back(segment(A[j], B[j], X[j]));
}
sort(iniqs.begin(), iniqs.end(), [](segment s1, segment s2) { return s1.x < s2.x; });
for(segment s : iniqs) {
set<segment>::iterator it = st.lower_bound(segment(s.l, s.r, s.x));
if(it != st.begin()) --it;
set<segment> nst;
while(it != st.end() && it->l < s.r) {
segment t = *it;
it = st.erase(it);
int al = max(t.l, s.l), ar = min(t.r, s.r);
if(al >= ar) continue;
qs.push_back(query(al, ar, (s.x + t.x) / 2, (s.x - t.x) / 2));
nst.insert(segment(al, ar, s.x));
if(t.l < al) nst.insert(segment(t.l, al, t.x));
if(ar < t.r) nst.insert(segment(ar, t.r, t.x));
}
st.insert(nst.begin(), nst.end());
}
for(segment s : st) {
qs.push_back(query(s.l, s.r, (inf + s.x) / 2, (inf - s.x) / 2));
}
}
for(int i = 0; i < Q; ++i) {
qs.push_back(query(Y[i], Y[i] + 1, L[i], -(i + 1)));
}
sort(qs.begin(), qs.end());
segtree seg(S);
for(query i : qs) {
if(i.w >= 0 && i.x - i.w == -inf) {
seg.update(i.l, i.r, i.x + i.w);
}
}
vector<int> ans(Q, -1);
for(query i : qs) {
if(i.w < 0) {
ans[-i.w - 1] = max(ans[-i.w - 1], seg.get(i.l) - i.x);
}
else {
seg.update(i.l, i.r, i.x + i.w);
}
}
reverse(qs.begin(), qs.end());
seg = segtree(S);
for(query i : qs) {
if(i.w >= 0 && i.x + i.w == inf) {
seg.update(i.l, i.r, -(i.x - i.w));
}
}
for(query i : qs) {
if(i.w < 0) {
ans[-i.w - 1] = max(ans[-i.w - 1], i.x - (-seg.get(i.l)));
}
else {
seg.update(i.l, i.r, -(i.x - i.w));
}
}
for(int i = 0; i < Q; ++i) {
if(ans[i] > inf / 3) cout << -1 << '\n';
else cout << ans[i] / 2 << '\n';
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
384 KB |
Output is correct |
2 |
Correct |
3 ms |
256 KB |
Output is correct |
3 |
Correct |
3 ms |
256 KB |
Output is correct |
4 |
Correct |
4 ms |
384 KB |
Output is correct |
5 |
Incorrect |
3 ms |
384 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
384 KB |
Output is correct |
2 |
Correct |
3 ms |
256 KB |
Output is correct |
3 |
Correct |
3 ms |
256 KB |
Output is correct |
4 |
Correct |
4 ms |
384 KB |
Output is correct |
5 |
Incorrect |
3 ms |
384 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1069 ms |
31324 KB |
Output is correct |
2 |
Correct |
831 ms |
29400 KB |
Output is correct |
3 |
Correct |
1416 ms |
60424 KB |
Output is correct |
4 |
Correct |
1103 ms |
34644 KB |
Output is correct |
5 |
Correct |
1030 ms |
32860 KB |
Output is correct |
6 |
Correct |
1043 ms |
30080 KB |
Output is correct |
7 |
Correct |
1400 ms |
60164 KB |
Output is correct |
8 |
Correct |
1082 ms |
34376 KB |
Output is correct |
9 |
Correct |
1048 ms |
30160 KB |
Output is correct |
10 |
Correct |
904 ms |
29256 KB |
Output is correct |
11 |
Correct |
889 ms |
28804 KB |
Output is correct |
12 |
Correct |
775 ms |
29028 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3550 ms |
143924 KB |
Output is correct |
2 |
Correct |
962 ms |
49140 KB |
Output is correct |
3 |
Execution timed out |
5090 ms |
290620 KB |
Time limit exceeded |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
384 KB |
Output is correct |
2 |
Correct |
3 ms |
256 KB |
Output is correct |
3 |
Correct |
3 ms |
256 KB |
Output is correct |
4 |
Correct |
4 ms |
384 KB |
Output is correct |
5 |
Incorrect |
3 ms |
384 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
384 KB |
Output is correct |
2 |
Correct |
3 ms |
256 KB |
Output is correct |
3 |
Correct |
3 ms |
256 KB |
Output is correct |
4 |
Correct |
4 ms |
384 KB |
Output is correct |
5 |
Incorrect |
3 ms |
384 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |