이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "horses.h"
#include<bits/stdc++.h>
#define mp make_pair
using namespace std;
typedef long long ll;
const int maxn=5e5+10;
const int mod=1e9+7;
int n;
int bseg[4*maxn];
int y[maxn];
pair<bool,int> pseg[4*maxn];
pair<bool,int> comb(pair<bool,int> a,pair<bool,int> b){
if(a.first || b.first){
return mp(true,ll(a.second)*ll(b.second)%mod);
}
if(ll(a.second)*ll(b.second)>=mod){
return mp(true,ll(a.second)*ll(b.second)%mod);
}
return mp(false,ll(a.second)*ll(b.second));
}
void buildp(int *x,int ind=1,int l=0,int r=n-1){
if(l==r){
pseg[ind]={false,x[l]};
return;
}
int mid=l+(r-l)/2;
buildp(x,2*ind,l,mid);
buildp(x,2*ind+1,mid+1,r);
pseg[ind]=comb(pseg[2*ind],pseg[2*ind+1]);
}
void updatep(int t,int v,int ind=1,int l=0,int r=n-1){
if(l==r){
pseg[ind]={false,v};
return;
}
int mid=l+(r-l)/2;
if(t<=mid) updatep(t,v,2*ind,l,mid);
if(t>mid) updatep(t,v,2*ind+1,mid+1,r);
pseg[ind]=comb(pseg[2*ind],pseg[2*ind+1]);
}
pair<bool,int> queryp(int tl,int tr,int ind=1,int l=0,int r=n-1){
if(tl<=l && r<=tr) return pseg[ind];
int mid=l+(r-l)/2;
pair<bool,int> ret={false,1};
if(tl<=mid) ret=comb(ret,queryp(tl,tr,2*ind,l,mid));
if(tr>mid) ret=comb(ret,queryp(tl,tr,2*ind+1,mid+1,r));
return ret;
}
int comp(int a,int b){
if(a>b) swap(a,b);
pair<bool,int> raz=queryp(a+1,b);
raz=comb(raz,mp(false,y[b]));
if(raz.first) return b;
if(raz.second>y[a]) return b;
else return a;
}
void buildb(int ind=1,int l=0,int r=n-1){
if(l==r){
bseg[ind]=l;
return;
}
int mid=l+(r-l)/2;
buildb(2*ind,l,mid);
buildb(2*ind+1,mid+1,r);
bseg[ind]=comp(bseg[2*ind],bseg[2*ind+1]);
}
void updateb(int t,int ind=1,int l=0,int r=n-1){
if(l==r) return;
int mid=l+(r-l)/2;
if(t<=mid) updateb(t,2*ind,l,mid);
if(t>mid) updateb(t,2*ind+1,mid+1,r);
bseg[ind]=comp(bseg[2*ind],bseg[2*ind+1]);
}
int init(int N, int X[], int Y[]) {
n=N;
for(int i=0;i<n;i++) y[i]=Y[i];
buildp(X);
buildb();
return comb(queryp(0,bseg[1]),mp(false,y[bseg[1]])).second;
}
int updateX(int pos, int val) {
updatep(pos,val);
updateb(pos);
return comb(queryp(0,bseg[1]),mp(false,y[bseg[1]])).second;
}
int updateY(int pos, int val) {
y[pos]=val;
updateb(pos);
return comb(queryp(0,bseg[1]),mp(false,y[bseg[1]])).second;
}
/*
3
2 1 3
3 4 1
1
2 1 2
*/
# | 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... |