Pagini recente » Cod sursa (job #77021) | Cod sursa (job #1944909) | Cod sursa (job #83625) | Cod sursa (job #1995596) | Cod sursa (job #2837217)
#include<fstream>
using namespace std;
ifstream cin("schi.in");
ofstream cout("schi.out");
int n, aib[30001], v[30001], rez[30001];
void update(int pos, int val)
{
for(int i=pos; i<=n; i+=(i&(-i)))
aib[i] += val;
}
int query(int val)
{
int rez;
int nr = 0;
int pos = 0;
int pas = 1<<17;
while(pas)
{
if(pos + pas <= n && nr + aib[pos+pas] < val)
{
pos += pas;
nr += aib[pos];
}
pas >>= 1;
}
return pos+1;
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>v[i];
update(i, 1);
}
for(int i=n; i>0; i--)
{
for(int j=1; j<=n; j++)
cout<<aib[j]<<" ";
cout<<'\n';
int pos = query(v[i]);
rez[pos] = i;
update(pos, -1);
}
for(int i=1; i<=n; i++)
cout<<rez[i]<<'\n';
return 0;
}
int sp[3001];
int main1()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>v[i];
sp[i] = i;
}
for(int i=n; i>0; i--)
{
int st = 1;
int dr = n;
int m = (st + dr)/2;
int pos = 0;
while(st<=dr)
{
m = (st + dr)/2;
if(sp[m] < v[i])
st = m+1;
else if(sp[m] >= v[i])
{
pos = m;
dr = m-1;
}
}
rez[pos] = i;
for(int j=pos; j<=n; j++)
sp[j] --;
}
for(int i=1; i<=n; i++)
cout<<rez[i]<<'\n';
}