#include "light.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
#define st first
#define nd second
typedef long long ll;
typedef pair<ll,ll> pii;
typedef pair<ll,ll> pll;
typedef long double ld;
typedef pair<ld,ld> pld;
vector <ll> akt;
vector <ll> takt;
ll siz = 1;
void trans(ll S)
{
takt.clear();
for(auto p : akt)
{
if(S-p+1)
takt.push_back(S-p+1);
}
sort(takt.begin() , takt.end());
}
void transm1(ll S)
{
akt.clear();
for(auto p : takt)
{
akt.push_back(S-p+1);
}
sort(akt.begin() , akt.end());
}
void prepare()
{
akt.push_back(1);
takt.push_back(1);
}
void Sch()
{
set<ll> si;
for(auto p : takt)si.insert(p);
takt.clear();
for(auto p : si)takt.push_back(p);
vector <ll> resti;
ll A = 1;
resti.push_back(1);
for(int i = 1; i < takt.size() ; i++)
{
auto p = takt[i];
while(A*2 < p)
{
A *= 2;
resti.push_back(A);
}
A = p;
resti.push_back(A);
}
A = 0;
takt.clear();
for(int i = 0; i < resti.size() ; i++)
{
auto p = resti[i];
if(i != resti.size()-1 && A*2 >= resti[i+1])
{
continue;
}
A = p;
takt.push_back(p);
}
}
pair<ll, vector <ll>> join(long long p)
{
siz += p;
trans(siz);
ll A = 1 ;
vector <ll> buff;
for(auto l : takt)
{
buff.push_back(max(1ll,l - siz));
}
for(auto l : buff)takt.push_back(l);
while(A <= p)
{
takt.push_back(A);
A *= 2;
}
sort(takt.begin() , takt.end());
Sch();
transm1(siz);
return (pair<ll, vector <ll>>){p,akt};
}
std::pair<long long, std::vector<long long>> leave(long long p)
{
siz -= p;
sort(akt.begin() ,akt.end());
while(akt.size() && akt.back() > siz)akt.pop_back();
trans(siz);
ll A = 1 ;
vector <ll> buff;
for(auto l : takt)
{
buff.push_back(max(1ll,l - siz));
}
for(auto l : buff)takt.push_back(l);
takt.push_back(1);
sort(takt.begin() , takt.end());
Sch();
transm1(siz);
return (pair<ll, vector <ll>>){p,akt};
}