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 "elephants.h"
#include<bits/stdc++.h>
using namespace std;
int n;
int RTN;
int cntGRP;
int l;
int a[150005];
int grp[150005];
vector<int> grpv[150005], dis[150005], nxt[150005];
vector< pair<int,int> > v;
int round_cnt = 0;
void calcgroup(int i) {
dis[i].resize(grpv[i].size());
nxt[i].resize(grpv[i].size());
int ptr = grpv[i].size()-1;
for(int j=grpv[i].size()-1; j>=0; j--) {
while(ptr > 0 && grpv[i][ptr] - grpv[i][j] > l) ptr--;
if(ptr == grpv[i].size()-1) {
dis[i][j] = 1;
nxt[i][j] = grpv[i][j] + l + 1;
} else {
dis[i][j] = dis[i][ptr+1] + 1;
nxt[i][j] = nxt[i][ptr+1];
}
}
}
void build() {
v.clear();
for(int i=0; i<n; i++) {
v.push_back({a[i], i});
}
sort(v.begin(), v.end());
for(int i=0; i<cntGRP; i++) grpv[i].clear();
for(int i=0; i<n; i++) {
grp[v[i].second] = i/RTN;
grpv[i/RTN].push_back(v[i].first);
}
for(int i=0; i<cntGRP; i++) {
calcgroup(i);
}
}
void init(int N, int L, int X[])
{
n = N; l = L;
RTN = ceil(sqrt(n));
cntGRP = (N-1) / RTN + 1;
for(int i=0; i<n; i++) a[i] = X[i];
build();
}
int update(int i, int y)
{
++round_cnt;
if(round_cnt % RTN == 0) {
a[i] = y;
build();
} else {
int origgrp = 0;
while(origgrp < cntGRP-1 && a[i] >= grpv[origgrp+1][0]) origgrp++;
int newgrp = 0;
while(newgrp < cntGRP-1 && y >= grpv[newgrp+1][0]) newgrp++;
for(int j=0; j<grpv[origgrp].size(); j++) {
if(grpv[origgrp][j] == a[i]) {
for(int k=j+1; k<grpv[origgrp].size(); k++) grpv[origgrp][k-1] = grpv[origgrp][k];
grpv[origgrp].pop_back();
break;
}
}
calcgroup(origgrp);
a[i] = y;
grpv[newgrp].push_back(y);
int ptr = grpv[newgrp].size()-1;
while(ptr > 0 && grpv[newgrp][ptr-1] > grpv[newgrp][ptr]) {
swap(grpv[newgrp][ptr-1], grpv[newgrp][ptr]);
ptr--;
}
calcgroup(newgrp);
}
// calculate answer
int prevv = -2e9;
int ans = 0;
for(int i=0; i<cntGRP; i++) {
if(grpv[i].size() == 0 || prevv > grpv[i][grpv[i].size()-1]) {
continue;
}
int pos = lower_bound(grpv[i].begin(), grpv[i].end(), prevv) - grpv[i].begin();
ans += dis[i][pos];
prevv = nxt[i][pos];
}
return ans;
}
Compilation message (stderr)
elephants.cpp: In function 'void calcgroup(int)':
elephants.cpp:21:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
21 | if(ptr == grpv[i].size()-1) {
| ~~~~^~~~~~~~~~~~~~~~~~~
elephants.cpp: In function 'int update(int, int)':
elephants.cpp:69:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
69 | for(int j=0; j<grpv[origgrp].size(); j++) {
| ~^~~~~~~~~~~~~~~~~~~~~
elephants.cpp:71:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
71 | for(int k=j+1; k<grpv[origgrp].size(); k++) grpv[origgrp][k-1] = grpv[origgrp][k];
| ~^~~~~~~~~~~~~~~~~~~~~
# | 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... |