Pagini recente » Cod sursa (job #2072021) | Profil tudorbuhnia | Cod sursa (job #229007) | Cod sursa (job #1302889) | Cod sursa (job #961344)
Cod sursa(job #961344)
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
#include<assert.h>
using namespace std;
#define NMAX 100001
struct entry {
int opt,poz;
string s;
};
entry v[NMAX],a[NMAX];
string rez[NMAX];
int arb[4*NMAX+1],poz,sol,l;
inline int compare(string a, string b)
{
int n,m;
n=a.size()-1;
m=b.size()-1;
if(n<m)
return -1;
else if(n>m)
return 1;
else {
int i;
for(i=0;i<=n;i++)
if(a[i]<b[i])
return -1;
else if(a[i]>b[i])
return 1;
return 0;
}
}
struct cmp {
bool operator () (const entry &a, const entry &b)
{
if(a.s.size() == b.s.size())
return a.s < b.s;
return a.s.size() < b.s.size();
}
};
inline void stand(int n)
{
int i,c;
l=0;
for(i=1;i<=n;i++)
if(v[i].opt==1) {
a[++l]=v[i];
a[l].poz=i;
}
sort(a+1,a+l+1,cmp());
c=0;
for(i=1;i<=l;i++) {
if(a[i].s.compare(a[i-1].s)!=0)
c++;
a[i].opt=c;
}
for(i=1;i<=l;i++)
v[a[i].poz].poz=a[i].opt;
for(i=1;i<=l;i++)
if(a[i].opt!=a[i-1].opt)
rez[a[i].opt]=a[i].s;
}
inline void update(int nod, int st, int dr)
{
int mij;
if(st==dr) {
arb[nod]=1;
return ;
}
mij=(st+dr)/2;
if(poz<=mij)
update(nod*2,st,mij);
else update(nod*2+1,mij+1,dr);
arb[nod]=arb[2*nod]+arb[2*nod+1];
}
inline void query(int nod, int st, int dr)
{
int mij;
if(st==dr) {
sol=st;
return ;
}
mij=(st+dr)/2;
if(poz<=arb[nod*2])
query(nod*2,st,mij);
else {
poz=poz-arb[2*nod];
query(2*nod+1,mij+1,dr);
}
}
inline int numar(string x)
{
int nr,i,n;
n=x.size()-1;
nr=0;
for(i=0;i<=n;i++)
nr=nr*10+x[i]-48;
return nr;
}
int main ()
{
int n,i;
ifstream f("nums.in");
ofstream g("nums.out");
f>>n;
for(i=1;i<=n;i++)
f>>v[i].opt>>v[i].s;
f.close();
stand(n);
for(i=1;i<=n;i++) {
if(v[i].opt==1) {
poz=v[i].poz;
assert(poz>=1 && poz<=l);
update(1,1,l);
}
else {
poz=numar(v[i].s);
query(1,1,l);
assert(sol>=1 && sol<=l);
g<<rez[sol]<<'\n';
}
}
g.close();
return 0;
}