#ifdef t9unkubj
#define _GLIBCXX_DEBUG
#include"debug.cpp"
//#include"template_no_debug.h"
#else
#define dbg(...) 199958
#endif
#pragma GCC optimize("O3")
using namespace std;
#include<bits/stdc++.h>
using ll=long long;
using ull=unsigned long long;
template<class T>using vc=vector<T>;
template<class T>using vvc=vc<vc<T>>;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define REP(i,j,n) for(ll i=(j);i<(ll)(n);i++)
#define DREP(i,n,m) for(ll i=(n);i>=(m);i--)
#define drep(i,n) for(ll i=((n)-1);i>=0;i--)
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
template<class T,class F>
bool chmin(T &x, F y){
if(x>y){
x=y;
return true;
}
return false;
}
template<class T, class F>
bool chmax(T &x, F y){
if(x<y){
x=y;
return true;
}
return false;
}
double pass_time=0;
template<class monoid>
struct segtree{
int n;
vector<monoid>node;
static monoid e(){
return monoid::e();
}
static monoid op(monoid a,monoid b){
return monoid::op(a,b);
}
segtree(){}
segtree(int n):n(n),node(n*2,e()){
assert(0<=n);
}
void set(int i,monoid x){
assert(0<=i&&i<n);
node[i+=n]=x;
while(i>>=1)node[i]=op(node[i<<1],node[i<<1|1]);
}
monoid prod(int l,int r) const {
assert(0<=l&&l<=r&&r<=n);
l+=n,r+=n;
monoid sml=e(),smr=e();
while(l<r){
if(l&1)sml=op(sml,node[l++]);
if(r&1)smr=op(node[--r],smr);
l>>=1,r>>=1;
}
return op(sml,smr);
}
monoid get(int i){
assert(0<=i&&i<=n);
return node[i+n];
}
//return max val s.t. f([L,val))) = true
template<class F>
int max_right(int L,const F&f) const {
assert(f(e()));
int l=n+L;
int w=1;
monoid ansL=e();
for(;L+w<=n;l>>=1,w<<=1){
if(l&1){
if(!(f(op(ansL,node[l]))))break;
ansL=op(ansL,node[l++]);
L+=w;
}
}
while(l<<=1,w>>=1){
if(L+w<=n&&f(op(ansL,node[l]))){
ansL=op(ansL,node[l++]);
L+=w;
}
}
return L;
}
//return min val s.t. f([val,R)) = true
template<class F>
int min_left(int R,const F&f) const {
assert(f(e()));
int r=n+R;
int w=1;
monoid ansR=e();
for(;R-w>=0;r>>=1,w<<=1){
if(r&1){
if(!(f(op(node[r-1],ansR))))break;
ansR=op(node[--r],ansR);
R-=w;
}
}
while(r<<=1,w>>=1){
if(R-w>=0&&f(op(node[r-1],ansR))){
ansR=op(node[--r],ansR);
R-=w;
}
}
return R;
}
};
template<class T,auto op,int extra>
struct base_dsu{
vector<int>par;
vector<T>data;
base_dsu(int n):par(n,-1){
static_assert(!extra,"e is needed");
}
base_dsu(int n,T e):par(n,-1),data(n,e){}
T& operator[](int i){
static_assert(extra,"No data");
return data[leader(i)];
}
int root(int x){
if(par[x]<0)return x;
else return par[x]=root(par[x]);
}
bool same(int x,int y){
return root(x)==root(y);
}
bool merge(int x,int y){
x=root(x);
y=root(y);
if(x==y)return false;
if(par[x]>par[y])swap(x,y);
par[x]+=par[y];
par[y]=x;
if(extra){
data[x]=op(data[y],data[x]);
}
return true;
}
int size(int x){
return -par[root(x)];
}
int leader(int x){
return root(x);
}
};
int tf323(int a,int b){return a;}
using dsu=base_dsu<int,tf323,0>;
template<class T,auto op>
using extra_dsu=base_dsu<T,op,1>;
struct mono{
int val;
static mono op(mono a,mono b){
return mono{a.val+b.val};
}
static mono add(mono a,int b){
return mono{a.val+b};
}
static mono e(){
return mono{0};
}
};
struct mono2{
int val;
static mono2 op(mono2 a,mono2 b){
return mono2{max(a.val,b.val)};
}
static mono2 e(){
return mono2{0};
}
};
pair<int,int>op(pair<int,int>a,pair<int,int>b){
return pair<int,int>(min(a.first,b.first),max(a.second,b.second));
}
int brute(int n,int q,int p,vc<int>k,vc<int>l,vc<int>r){
pair<int,int>res{-1,-1};
rep(i,n){
int t=0;
auto nk=k;
nk.insert(nk.begin()+i,p);
rep(j,q){
int M=*max_element(nk.begin()+l[j],nk.begin()+r[j]+1);
if(M==p)t++;
int now=l[j];
rep(s,r[j]-l[j]){
if(nk[now]==M){
now++;
}
nk.erase(nk.begin()+now);
}
}
chmax(res,pair<int,int>{t,-i});
}
return -res.second;
}
int solve(int n,int q,int p,vc<int>k,vc<int>l,vc<int>r){
segtree<mono2>seg(n-1);
rep(i,n-1)seg.set(i,mono2{k[i]});
vc<int>tl(q),tr(q);
{
extra_dsu<pair<int,int>,op>dsu(n,{(int)1e9,(int)-1e9});
rep(i,n)dsu[i]={i,i};
set<int>ex;
rep(i,n)ex.insert(i);
segtree<mono>seg(n);
rep(i,n)seg.set(i,mono{1});
rep(i,q){
int S=seg.prod(0,n).val;
int LEFT=seg.max_right(0,[&](auto a){
return a.val<l[i]+1;
});
int RIGHT=seg.min_left(n,[&](auto a){
return a.val<(S-r[i]);
})-1;
tl[i]=dsu[LEFT].first,tr[i]=dsu[RIGHT].second;
dsu.merge(LEFT,RIGHT);
auto itr=ex.lower_bound(LEFT);
while(1){
if(itr==ex.end()||*itr>=r[i])break;
dsu.merge(*itr,LEFT);
seg.set(*itr,mono{0});
ex.erase(itr);
itr=ex.lower_bound(LEFT);
}
}
}
segtree<mono>win(q);
set<int>lose;
lose.insert(q);
pair<int,int>res{0,0};
vvc<pair<int,int>>query(n+1);
rep(i,q){
query[tl[i]].push_back({i,1});
query[tr[i]+1].push_back({i,-1});
}
rep(i,n){
for(auto&[idx,t]:query[i]){
if(t==1){
auto R=seg.prod(tl[idx],tr[idx]);
if(R.val<p){
win.set(idx,mono{1});
}else{
lose.insert(idx);
}
}else{
auto R=seg.prod(tl[idx],tr[idx]);
if(R.val<p){
win.set(idx,mono{0});
}else{
lose.erase(idx);
}
}
}
chmax(res,pair<int,int>(win.prod(0,*lose.begin()).val,-i));
}
return -res.second;
}
int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {
vc<int>k(N-1),l(C),r(C);
rep(i,N-1)k[i]=K[i];
rep(i,C)l[i]=S[i],r[i]=E[i];
return brute(N,C,R,k,l,r);
}
mt19937 mt;
namespace judge{
void check(){
int n=5,q=mt()%n+1,p=mt()%n;
vc<int>k(n-1),l(q),r(q);
rep(i,n-1){
k[i]=mt()%n;
}
rep(i,q)l[i]=mt()%n,r[i]=mt()%n;
set<int>st;
st.insert(p);
rep(i,n-1)st.insert(k[i]);
if(st.size()!=n){
return;
}
int seg=n-1;
rep(i,q){
if(seg<r[i])return;
seg-=r[i]-l[i];
if(l[i]>=r[i])return;
}
if(solve(n,q,p,k,l,r)!=brute(n,q,p,k,l,r)){
dbg(n,q,p,k,l,r);
dbg(solve(n,q,p,k,l,r));
dbg(brute(n,q,p,k,l,r));
assert(0);
}
dbg("OK"s);
}
void f(){
while(1)check();
}
void run(){
int n,c,r;
cin>>n>>c>>r;
vc<int>k(n-1),s(c),e(c);
rep(i,n-1)cin>>k[i];
rep(i,c)cin>>s[i]>>e[i];
cout<<brute(n,c,r,k,s,e)<<"\n";
}
};
//int main(){judge::f();}
//g++ env/tournament.cpp -D t9unkubj
/*
5 3 3
1 0 2 4
1 3
0 1
0 1
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |