#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const int MaxN = 1e6 + 5;
int n, d;
long long arr[MaxN];
int curPos;
vector<int> tmpplace[MaxN];
struct Change
{
int curtime1, curtime2, i, pos;
bool isadd;
Change() = default;
Change(int curtime)
{
curtime1 = curtime;
pos = curPos;
curtime2 = -1;
}
};
vector<Change> cur[MaxN];
vector<int> nowplace[MaxN];
void init(int N, int D, int H[])
{
n = N;
d = D;
curPos = 0;
tmpplace[0].clear();
for (int x = 1; x <= n; x++)
{
arr[x] = H[x - 1];
cur[x].push_back(Change(0));
}
}
void Add(int u, int v, int d)
{
vector<int> tmp;
bool hasadd = false;
for (int x : nowplace[u])
{
if (!hasadd && arr[v] <= arr[x])
{
hasadd = true;
tmp.push_back(v);
}
tmp.push_back(x);
}
if (!hasadd)
{
tmp.push_back(v);
}
nowplace[u] = tmp;
if (~cur[u].back().curtime2)
{
curPos++;
tmpplace[curPos] = tmp;
cur[u].push_back(Change(d));
return;
}
cur[u].back().curtime2 = d;
cur[u].back().isadd = true;
cur[u].back().i = v;
}
void Remove(int u, int v, int d)
{
vector<int> tmp;
for (int x : nowplace[u])
{
if (x != v)
{
tmp.push_back(x);
}
}
nowplace[u] = tmp;
if (~cur[u].back().curtime2)
{
curPos++;
tmpplace[curPos] = tmp;
cur[u].push_back(Change(d));
return;
}
cur[u].back().curtime2 = d;
cur[u].back().isadd = false;
cur[u].back().i = v;
}
void curseChanges(int U, int A[], int B[])
{
curPos = 0;
set<pair<int, int>> s;
for (int w = 0; w < U; w++)
{
int u = A[w] + 1, v = B[w] + 1;
pair<int, int> tmp = make_pair(min(u, v), max(u, v));
if (s.find(tmp) == s.end())
{
Add(u, v, w + 1);
Add(v, u, w + 1);
s.insert(tmp);
}
else
{
Remove(u, v, w + 1);
Remove(v, u, w + 1);
s.erase(tmp);
}
}
for (int x = 1; x <= n; x++)
{
nowplace[x].clear();
}
}
vector<int> aft[2];
int BSearch(int u, int d)
{
int l = 0, r = (int)cur[u].size() - 1, mid, res = (int)cur[u].size();
while (l <= r)
{
mid = (l + r) / 2;
if (cur[u][mid].curtime1 <= d)
{
res = mid;
l = mid + 1;
}
else
{
r = mid - 1;
}
}
return res;
}
void Reconstruct(int id, int u, int d)
{
int p = BSearch(u, d);
aft[id].clear();
if (~cur[u][p].curtime2 && cur[u][p].curtime2 <= d)
{
int k = cur[u][p].i;
if (cur[u][p].isadd)
{
bool hasadd = false;
for (int v : tmpplace[cur[u][p].pos])
{
if (!hasadd && arr[k] <= arr[v])
{
aft[id].push_back(k);
hasadd = true;
}
aft[id].push_back(v);
}
if (!hasadd)
{
aft[id].push_back(k);
}
}
else
{
for (int v : tmpplace[cur[u][p].pos])
{
if (v != k)
{
aft[id].push_back(v);
}
}
}
return;
}
aft[id] = tmpplace[cur[u][p].pos];
}
int question(int X, int Y, int V)
{
int u = X + 1, v = Y + 1, w = V;
Reconstruct(0, u, w);
Reconstruct(1, v, w);
if (aft[0].empty() || aft[1].empty())
{
return 1e9;
}
int y = 0;
long long res = 1e9 + 1;
for (int x = 0; x < (int)aft[0].size(); x++)
{
while (y < (int)aft[1].size() && arr[aft[0][x]] > arr[aft[1][y]])
{
y++;
}
if (y < (int)aft[1].size())
{
res = min(res, abs(arr[aft[0][x]] - arr[aft[1][y]]));
}
if (y > 0)
{
res = min(res, abs(arr[aft[0][x]] - arr[aft[1][y - 1]]));
}
}
return res;
}
#ifdef cpismylifeOwO
int main()
{
//freopen("POTION.INP", "r", stdin);
//freopen("POTION.OUT", "w", stdout);
int N, D, U, Q;
std::ios::sync_with_stdio(false); std::cin.tie(NULL);
std::cin >> N >> D >> U >> Q;
int *F = new int[N];
for (int i=0; i<N; i++)
std::cin >> F[i];
init(N, D, F);
int *A = new int[U], *B = new int[U];
for (int i=0; i<U; i++) {
std::cin >> A[i] >> B[i];
}
curseChanges(U, A, B);
bool correct = true;
for (int i=0; i<Q; i++) {
int X,Y,V,CorrectAnswer;
std::cin >> X >> Y >> V >> CorrectAnswer;
int YourAnswer = question(X,Y,V);
if (YourAnswer != CorrectAnswer) {
std::cout << "WA! Question: " << i
<< " (X=" << X << ", Y=" << Y << ", V=" << V << ") "
<< "Your answer: " << YourAnswer
<< " Correct Answer: " << CorrectAnswer << std::endl;
correct = false;
} else {
std::cerr << YourAnswer << " - OK" << std::endl;
}
}
if (correct) {
std::cout << "Correct." << std::endl;
} else std::cout << "Incorrect." << std::endl;
return 0;
}
#endif // cpismylifeOwO
| # | 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... |