Pagini recente » Cod sursa (job #2928406) | Cod sursa (job #1306923) | Cod sursa (job #2519988) | Cod sursa (job #2859742) | Cod sursa (job #3174155)
#include <iostream>
#include<vector>
#include<cmath>
#include <fstream>
using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
vector<int>aint;
vector<int>poz;
vector<int>rezultat;
int abs_dr;
void build(int poz)
{
if(abs_dr<=poz<2*abs_dr)
{
return;
}
aint[poz]=aint[poz*2]+aint[poz*2+1];
build(poz*2);
build(poz*2+1);
}
void update(int poz)
{
if(poz==0)
{
return;
}
aint[poz]=aint[poz*2]+aint[poz*2+1];
update(poz/2);
}
int query(int nod,int skip,int lim_st,int lim_dr)
{
if(lim_st==lim_dr)
{
return lim_st;
}
int mij=(lim_st+lim_dr)/2;
if(skip<=aint[nod*2])
{
query(nod*2,skip,lim_st,mij);
}
else
{
query(nod*2+1,skip-aint[nod*2],mij+1,lim_dr);
}
}
int main()
{
int poz_update;
int n;
fin>>n;
int log2n=log2(n);
log2n+=((1<<log2n)<n);
abs_dr=(1<<log2n);
aint.resize(abs_dr*2+1);
poz.resize(n+1);
rezultat.resize(n+1);
int lim_st=abs_dr;
int lim_dr=abs_dr*2-1;
for(int i=lim_st+1; i<=lim_dr; i++)
{
aint[i]=1;
}
for(int i=1;i<=lim_dr;i++)
{
cout<<aint[i]<<" ";
}
cout<<"\n";
build(1);//build
for(int i=1;i<=lim_dr;i++)
{
cout<<aint[i]<<" ";
}
cout<<"\n";
for(int i=1; i<=n; i++)
fin>>poz[i];
for(int i=n; i>=1; i--)
{
poz_update=query(1,poz[i],1,abs_dr);
cout<<poz_update<<" "<<poz[i]<<" "<<i<<"\n";
rezultat[poz_update]=i;
aint[poz_update]=0;
update(poz_update/2);
}
for(int i=1;i<=n;i++)
{
fout<<rezultat[i]<<"\n";
}
}