Pagini recente » Cod sursa (job #3249367) | Cod sursa (job #3165715) | Cod sursa (job #2418311) | Cod sursa (job #1862716) | Cod sursa (job #830689)
Cod sursa(job #830689)
#include <fstream>
#define LS (current_position<<1)
#define RS (current_position<<1)+1
#define INF 30004
#define NMAX 70000
using namespace std;
ifstream in("schi.in");
ofstream out("schi.out");
short int N,begin,end,value;
struct my_struct{short int pozitie,add,nr;}V[NMAX];
void Update(short int current_position,short int start,short int final)
{
if(start>=begin && final <=end)
V[current_position].add +=value;
else
{
short int med = (start + final) / 2;
if(begin<=med)
Update(LS,start,med);
if(med+1<=end)
Update(RS,med+1,final);
if(V[LS].pozitie+V[LS].add<V[RS].pozitie+V[RS].add)
V[current_position].nr = V[LS].nr,V[current_position].pozitie = V[LS].pozitie+V[LS].add;
else V[current_position].nr = V[RS].nr,V[current_position].pozitie = V[RS].pozitie+V[RS].add;
}
}
void Refresh(short int current_position,short int start,short int final)
{
if(start == final);
else
{
short int med = (start + final) / 2;
Refresh(LS,start,med);
Refresh(RS,med+1,final);
if(V[LS].pozitie+V[LS].add<V[RS].pozitie+V[RS].add)
V[current_position].nr = V[LS].nr,V[current_position].pozitie = V[LS].pozitie+V[LS].add;
else V[current_position].nr = V[RS].nr,V[current_position].pozitie = V[RS].pozitie+V[RS].add;
}
}
int main()
{
short int i,x;
in>>N;
for(i=1;i<=N;i++)
in>>x,V[N+i-1].nr = i,V[N+i-1].pozitie = x;
Refresh(1,1,N);
for(i=1;i<=N;i++)
{
out<<(x = V[1].nr)<<'\n';
begin = x,end = x,value = INF;
Update(1,1,N);
begin = 1,end = x,value = 1;
Update(1,1,N);
}
return 0;
}