#include <string>
#include <vector>
using namespace std;
int asdf;
struct list{
int time;
int last;
int next;
list() : time(0), last(0), next(0) {}
list(int c1, int c2, int c3) : time(c1), last(c2), next(c3) {}
};
typedef struct list list;
struct data_{
int d;
int less;
int more;
int last;
int next;
int p;
int h;
data_() : d(0), less(0), more(0), last(0), next(0), p(0), h(1) {}
data_(int c1, int c2, int c3, int c4, int c5, int c6) : d(c1), less(c2), more(c3), last(c4), next(c5), p(c6), h(1) {}
};
typedef struct data_ data_;
//times 데이터 정렬 벡터
vector<data_> time;
int seed;
void UpdateTimeH(int i){
int lastH=0;
if(time[i].more!=-1)
lastH=time[time[i].more].h;
if(time[i].less!=-1)
lastH=time[time[i].more].h;
time[i].h=lastH/2 + lastH%2 +1;
}
void UpdateTimeSpin(int i, int type){//type : 1 -> 반시계 type : 2 -> 시계
int save_=-1;
int ii;
if(type==1){
ii=time[i].more;
if(time[ii].less!=-1){
save_=time[ii].less;
}
time[ii].less=i;
time[i].more=save_;
UpdateTimeH(i);
UpdateTimeH(ii);
}
if(type==2){
ii=time[i].less;
if(time[ii].more!=-1){
save_=time[ii].more;
}
time[ii].more=i;
time[i].less=save_;
UpdateTimeH(i);
UpdateTimeH(ii);
}
if(time[i].p!=-1 && time[time[i].p].less==i){
time[time[i].p].less=ii;
}
if(time[i].p!=-1 && time[time[i].p].more==i){
time[time[i].p].more=ii;
}
time[ii].p=time[i].p;
time[i].p=ii;
if(seed==i) seed=ii;
}
void UpdateTimeE(int i){
UpdateTimeH(i);
int ch_=(time[i].less!=-1 ? time[time[i].less].h : 0)-(time[i].more!=-1 ? time[time[i].more].h : 0);
if(ch_>1)
UpdateTimeSpin(i, 2);
if(ch_<-1)
UpdateTimeSpin(i, 1);
}
void UpdateTime(int num){
int i = seed;//확인 중인 값
int ml=0;//1 -> more, 2 -> less
do{
if(ml==1) i=time[i].more;
if(ml==2) i=time[i].less;
UpdateTimeE(i);
if(time[i].d > num){
ml=2;
if(time[i].less==-1){
break;
}
}
else{
ml=1;
if(time[i].more==-1){
break;
}
}
}while(time[i].more!=-1 || time[i].less!=-1);//다음 and 이전 값이 있는 경우
int newc=time.size();
if(ml==1){
time.push_back({num, -1, -1, i, time[i].next, i});
time[i].more=newc;
time[i].next=newc;
if(time[i].next!=-1) time[time[newc].next].last=newc;
}else if(ml==2){
time.push_back({num, -1, -1, time[i].last, i, i});
time[i].less=newc;
time[i].last=newc;
if(time[i].last!=-1) time[time[newc].last].next=newc;
}
UpdateTimeE(i);
}
long long solution(int n, vector<int> times) {
if(times.size()==2) return -1;
asdf=0;
//데이터 정렬
time.push_back({times[0], -1, -1, -1, -1, -1});
for(int i=1, seed=0;i<times.size();i++){
UpdateTime(times[i]);
}
return time[time[time[seed].more].less].less;//time[seed].d*1000000+time[time[seed].more].d*10000+time[time[time[seed].more].more].d*100+time[time[time[time[seed].more].more].more].d;
return time[0].d*1000000+time[time[0].next].d*10000+time[time[time[0].next].next].d*100+time[time[time[time[0].next].next].next].d;
long long answer = 0;
unsigned long long sum=1;
/*list list1;
for(int i=0; i<times.size(); i++){
sum*=times[i];
}
int a[100000], newsum;
for(int i=0; i<times.size(); i++){
a[i]=sum/times[i];
newsum+=a[i];
}
if(n>newsum){
n-=newsum;
}
else if(n<newsum){
}
else if(n==newsum){
return newsum*(n/times[times.size()-1]);
}*/
return answer;
}
To embed this project on your website, copy the following code and paste it into your website's HTML: