Pagini recente » Cod sursa (job #1549326) | Cod sursa (job #1312678) | Cod sursa (job #1787874) | Cod sursa (job #2569591) | Cod sursa (job #930268)
Cod sursa(job #930268)
#include <fstream>
#include <vector>
#include <algorithm>
#define MAXN 100005
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");
struct numar{
vector<short int> c;};
int n,query[MAXN],nrnum,ind[MAXN],poz[MAXN],tip,y,ai[4*MAXN],mij,sol;
numar x[MAXN];
char s[MAXN];
bool Comp(int a,int b);
void update(int nod,int st,int dr);
int solve(int nod,int st,int dr);
int main()
{
int i,j;
f>>n;
for(i=1;i<=n;i++){
f>>tip;
if(tip){
ind[++nrnum]=i;
f.getline(s,MAXN,'\n');
for(j=1;s[j]!='\0';j++)
x[i].c.push_back(s[j]-'0');}
else
f>>query[i];}
sort(ind+1,ind+nrnum+1,Comp);
for(i=1;i<=nrnum;i++)
poz[ind[i]]=i;
for(i=1;i<=n;i++){
if(query[i]){
y=query[i];
sol=solve(1,1,n);
sol=ind[sol];
for(j=0;j<x[sol].c.size();j++)
g<<x[sol].c[j];
g<<'\n';}
else{
y=poz[i];
update(1,1,n);}}
f.close();
g.close();
return 0;
}
bool Comp(int a,int b){
short int i;
if(x[a].c.size()!=x[b].c.size())
return x[a].c.size()<x[b].c.size();
for(i=0;i<x[a].c.size()&&x[a].c[i]==x[b].c[i];i++);
//if(i==x[a].c.size()){
return x[a].c[i]<x[b].c[i];}
void update(int nod,int st,int dr){
if(st==dr){
ai[nod]++;
return;}
mij=(st+dr)/2;
if(y<=mij)
update(2*nod,st,mij);
else
update(2*nod+1,mij+1,dr);
ai[nod]=ai[2*nod]+ai[2*nod+1];}
int solve(int nod,int st,int dr){
if(st==dr)
return st;
mij=(st+dr)/2;
if(ai[2*nod]<y){
y-=ai[2*nod];
return solve(2*nod+1,mij+1,dr);}
else
return solve(2*nod,st,mij);}