#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx2")
struct node{
node *l,*r;
bool sum;
node(){
l = r = nullptr;
sum = 0;
}
void recalc(){
sum = false;
if(l)
sum |= l->sum;
if(r)
sum |= r->sum;
}
};
inline bool Sum(node* v){
return v ? v->sum : 0;
}
constexpr int N = (int)1e5;
vector<node*> roots[N];
vector<int> times[N];
node* upd(node* v,int l,int r,int pos){
if(l == r){
node* nw = new node();
if(v)
*nw = *v;
nw->sum ^= 1;
return nw;
}
int m = (l+r)>>1;
node* nw = new node();
if(v)
*nw = *v;
if(pos <= m){
nw->l = upd(nw->l,l,m,pos);
if(Sum(nw->l) == 0){
delete nw->l;
nw->l = nullptr;
}
} else {
nw->r = upd(nw->r,m+1,r,pos);
if(Sum(nw->r) == 0){
delete nw->r;
nw->r = nullptr;
}
}
nw->recalc();
return nw;
}
int H[N];
int n;
int D;
void init(int N, int D, int H[]) {
::D = D;
for(int i = 0; i < N; i++){
::H[i] = H[i];
}
::n = N;
return;
}
void curseChanges(int U, int A[], int B[]) {
node* root = new node();
for(int i = 0; i < n; i++){
roots[i].push_back(root);
times[i].push_back(0);
}
for(int i = 0; i < U; i++){
int a = A[i], b = B[i];
int tm = i+1;
roots[a].push_back(upd(roots[a].back(),0,n-1,b));
times[a].push_back(tm);
// cerr << "adding " << tm << " to " << a << " and " << b << "\n";
roots[b].push_back(upd(roots[b].back(),0,n-1,a));
times[b].push_back(tm);
}
return;
}
void get(node* v,int l,int r,vector<int>& heights){
if(Sum(v) == 0) return;
if(l == r){
heights.push_back(H[l]);
return;
}
int m = (l+r)>>1;
get(v->l,l,m,heights);
get(v->r,m+1,r,heights);
return;
}
int question(int x, int y, int v) {
// cerr << "x,y,v: " << x << " " << y << " " << v << "\n";
// cerr << "times " << x << ": ";
// for(auto& v : times[x]){
// cerr << v << " ";
// }
// cerr << "\n";
// cerr << "times " << y << ": ";
// for(auto& v : times[y]){
// cerr << v << " ";
// }
// cerr << "\n";
int pos1 = upper_bound(times[x].begin(),times[x].end(),v) - times[x].begin() - 1;
int pos2 = upper_bound(times[y].begin(),times[y].end(),v) - times[y].begin() - 1;
// cerr << "pos1: " << pos1 << "\n";
// cerr << "pos2: " << pos2 << "\n";
node* root1 = roots[x][pos1];
node* root2 = roots[y][pos2];
vector<int> heights[2];
get(root1,0,n-1,heights[0]);
get(root2,0,n-1,heights[1]);
sort(heights[0].begin(),heights[0].end());
sort(heights[1].begin(),heights[1].end());
int ans = (int)1e9;
int j = 0;
for(auto& h : heights[0]){
while(j < heights[1].size() && heights[1][j] < h) j++;
for(int i = max(0,j-1); i < min(j+1,(int)heights[1].size()); i++)
ans = min(ans,abs(h-heights[1][i]));
}
// cerr << "ans: " << ans << "\n";
return ans;
}
Compilation message
potion.cpp: In function 'int question(int, int, int)':
potion.cpp:132:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
132 | while(j < heights[1].size() && heights[1][j] < h) j++;
| ~~^~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
4944 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
5712 KB |
Output is correct |
2 |
Correct |
4 ms |
5716 KB |
Output is correct |
3 |
Correct |
4 ms |
5840 KB |
Output is correct |
4 |
Correct |
24 ms |
13124 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
734 ms |
239600 KB |
Output is correct |
2 |
Correct |
683 ms |
239616 KB |
Output is correct |
3 |
Correct |
369 ms |
158948 KB |
Output is correct |
4 |
Execution timed out |
3073 ms |
140776 KB |
Time limit exceeded |
5 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
620 ms |
239732 KB |
Output is correct |
2 |
Execution timed out |
3055 ms |
163512 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
80 ms |
14928 KB |
Output is correct |
2 |
Correct |
126 ms |
12028 KB |
Output is correct |
3 |
Correct |
196 ms |
11712 KB |
Output is correct |
4 |
Correct |
1237 ms |
13352 KB |
Output is correct |
5 |
Correct |
1148 ms |
14404 KB |
Output is correct |
6 |
Correct |
163 ms |
12240 KB |
Output is correct |
7 |
Correct |
923 ms |
12404 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
4944 KB |
Output is correct |
2 |
Correct |
6 ms |
5712 KB |
Output is correct |
3 |
Correct |
4 ms |
5716 KB |
Output is correct |
4 |
Correct |
4 ms |
5840 KB |
Output is correct |
5 |
Correct |
24 ms |
13124 KB |
Output is correct |
6 |
Correct |
734 ms |
239600 KB |
Output is correct |
7 |
Correct |
683 ms |
239616 KB |
Output is correct |
8 |
Correct |
369 ms |
158948 KB |
Output is correct |
9 |
Execution timed out |
3073 ms |
140776 KB |
Time limit exceeded |
10 |
Halted |
0 ms |
0 KB |
- |