This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "minerals.h"
#include <bits/stdc++.h>
#define pb push_back
#define all(v) ((v).begin(), (v).end())
#define sortv(v) sort(all(v))
#define sz(v) ((int)(v).size())
#define uniqv(v) (v).erase(unique(all(v)), (v).end())
#define umax(a, b) (a)=max((a), (b))
#define umin(a, b) (a)=min((a), (b))
#define FOR(i,a,b) for(int i = (a); i <= (b); i++)
#define rep(i,n) FOR(i,1,n)
#define rep0(i,n) FOR(i,0,(int)(n)-1)
#define FI first
#define SE second
#define INF 2000000000
#define INFLL 1000000000000000000LL
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int MAX_N = 43000;
int idx[MAX_N*2+1];
vector<pii> ans;
bool chk[MAX_N*2+1];
vector<int> vt1, vt2;
int N;
deque<pii> dq;
void solve(){
/*printf("%d %d\n", x, y);
for(int i=x; i<=y; i++){
printf("%d ", idx[i]);
if(i==(x+y)/2){
printf("\n");
}
}
printf("\n");*/
dq.pb({1, 2*N});
int x, y;
while(!dq.empty()){
x = dq.front().first; y = dq.front().second; dq.pop_front();
if(y==x+1){
ans.pb({idx[x], idx[y]});
if(chk[x]){
Query(idx[x]); Query(idx[y]);
}
continue;
}
int l = (y-x+1)/2;
int m = l/2;
int i;
if(chk[x]){
int prv;
i = x+l-1;
while(m>0){
prv = Query(idx[i]);
i--; m--;
}
for(int j = y; j >= x+l; j--){
int now = Query(idx[j]);
if(now==prv){
Query(idx[j]);
vt1.push_back(idx[j]);
}else{
vt2.push_back(idx[j]);
}
prv = now;
}
}else{
int prv;
i = x;
while(m>0){
prv = Query(idx[i]);
chk[i] = true;
m--; i++;
}
i--;
for(int j=x+l; j<=y; j++){
int now = Query(idx[j]);
if(now==prv){
vt1.push_back(idx[j]);
}else{
Query(idx[j]);
vt2.push_back(idx[j]);
}
}
}
int i3 = i;
int i2 = i+l;
i = x+l-1;
while(i>i3){
chk[i2] = false;
idx[i2] = idx[i];
i--; i2--;
}
i2 = i + l+1;
i = i3+1;
while(!vt1.empty()){
chk[i] = true;
idx[i] = vt1.back(); vt1.pop_back(); i++;
}
while(!vt2.empty()){
chk[i2] = false;
idx[i2] = vt2.back(); vt2.pop_back(); i2++;
}
dq.pb({x, i3*2 - x + 1}); dq.pb({i3*2 - x + 2, y});
}
}
void Solve(int n) {
N = n;
int prv = 0;
int i1 = 1, i2 = N+1;
for(int i=1; i<=N*2; i++){
int now = Query(i);
if(now==prv){
idx[i2++] = i;
}else{
idx[i1++] = i;
}
prv = now;
}
for(int i=1; i<=N*2; i++) Query(i);
solve();
for(int i=0; i<ans.size(); i++){
Answer(ans[i].first, ans[i].second);
}
}
Compilation message (stderr)
minerals.cpp: In function 'void Solve(int)':
minerals.cpp:133:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0; i<ans.size(); i++){
~^~~~~~~~~~~
minerals.cpp: In function 'void solve()':
minerals.cpp:88:5: warning: 'prv' may be used uninitialized in this function [-Wmaybe-uninitialized]
if(now==prv){
^~
minerals.cpp:69:5: warning: 'prv' may be used uninitialized in this function [-Wmaybe-uninitialized]
if(now==prv){
^~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |