Pagini recente » Cod sursa (job #3180743) | Cod sursa (job #844170) | Cod sursa (job #2278084) | Cod sursa (job #1520641) | Cod sursa (job #578345)
Cod sursa(job #578345)
#include<fstream>
#include<iostream>
#include<algorithm>
#include<vector>
#define DIM 100004
using namespace std;
int arb[4*DIM],n,caract[DIM],sor[DIM],uq[DIM],cate,poz,rasp;
vector<char>S[DIM];
int comp(int a,int b);
int cauta(int nod,int st,int dr,int val);
void update(int nod,int st,int dr);
int main()
{
ifstream fin("nums.in");
ofstream fout("nums.out");
fin>>n;
int i,j;
int q,c;
for(i=1;i<=n;i++)
{
fin>>q;
if(q==1)
{
fin.get();
sor[++cate]=i;
char d;
while(fin.get(d) && d>='0' && d<='9')
{
S[i].push_back(d);
}
}
else
{
fin>>c;
uq[i]=c;
}
}
sort(sor+1,sor+cate+1,comp);
for(i=1;i<=cate;i++)
caract[sor[i]]=i;
for(i=1;i<=n;i++)
{
if(caract[i]!=0)
{
poz=caract[i];
update(1,1,n);
}
else
{
rasp=cauta(1,1,n,uq[i]);
for(j=0;j<S[sor[rasp]].size();j++)
fout<<S[sor[rasp]][j];
fout<<"\n";
}
}
return 0;
}
void update(int nod,int st,int dr)
{
if(st==dr)
{
arb[nod]=1;
return ;
}
else
{
int mij=(st+dr)/2;
if(poz<=mij)
update(2*nod,st,mij);
else
update(2*nod+1,mij+1,dr);
}
arb[nod]=arb[2*nod]+arb[2*nod+1];
}
int cauta(int nod,int st,int dr,int val)
{
if(st==dr)
return st;
int mij=(st+dr)/2;
if(arb[2*nod]>=val)
return cauta(2*nod,st,mij,val);
val-=arb[2*nod];
return cauta(2*nod+1,mij+1,dr,val);
}
int comp(int a,int b)
{
if(S[a].size()==S[b].size())
{
if(S[a]>S[b])
return 0;
return 1;
}
else
{
if(S[a].size()>S[b].size())
return 0;
else
return 1;
}
return 1;
}