Pagini recente » Cod sursa (job #1679840) | Cod sursa (job #3135541) | Cod sursa (job #636930) | Cod sursa (job #2463357) | Cod sursa (job #1835791)
#include <bits/stdc++.h>
#define MAXN 100000
#define zeros(x) (x&(-x))
int aib[MAXN+1];
inline void update(int poz,int n){
int i;
for(i=poz;i<=n;i+=zeros(i))
aib[i]++;
}
inline int query(int poz){
int i,ans=0;
for(i=poz;i>0;i-=zeros(i))
ans+=aib[i];
return ans;
}
struct Huge{
char *val;
int cif;
int poz;
};
Huge V[MAXN+1];
char v[MAXN+1];
bool cmp(Huge A,Huge B){
if(A.cif>B.cif)
return 0;
if(A.cif<B.cif)
return 1;
int i=1;
while(i<=A.cif&&A.val[i]==B.val[i])
i++;
if(i<=A.cif)
return A.val[i]<B.val[i];
return A.poz<B.poz;
}
int vec[MAXN+1];
bool f[MAXN+1];
inline bool egal(int p1,int p2){
if(V[p1].cif!=V[p2].cif)
return 0;
int i=1;
while(i<=V[p1].cif&&V[p1].val[i]==V[p2].val[i])
i++;
if(i==V[p1].cif+1)
return 1;
return 0;
}
int main(){
FILE*fi,*fout;
int i,j,n,u,rez,pas,t,ans;
char a;
fi=fopen("nums.in" ,"r");
fout=fopen("nums.out" ,"w");
fscanf(fi,"%d " ,&n);
u=0;
for(i=1;i<=n;i++){
fscanf(fi,"%d " ,&t);
f[i]=t;
if(t==1){
u++;
V[u].poz=i;
a=fgetc(fi);
while(isdigit(a)){
v[++V[u].cif]=a-'0';
a=fgetc(fi);
}
V[u].val=(char *) malloc((V[u].cif+1)*sizeof(char));
for(j=1;j<=V[u].cif;j++)
V[u].val[j]=v[j];
}
else
fscanf(fi,"%d " ,&vec[i]);
}
std::sort(V+1,V+u+1,cmp);
for(i=1;i<=u;i++)
if(egal(i-1,i)==0)
vec[V[i].poz]=i;
else
vec[V[i].poz]=-1;
for(i=1;i<=n;i++)
if(f[i]==1){
if(vec[i]>-1)
update(vec[i],u);
}
else{
rez=0;
ans=0;
for(pas=1<<17;pas;pas>>=1)
if(rez+pas<=u&&ans+aib[rez+pas]<vec[i]){
rez+=pas;
ans+=aib[rez];
}
rez++;
for(j=1;j<=V[rez].cif;j++)
fputc(V[rez].val[j]+'0',fout);
fputc('\n',fout);
}
fclose(fi);
fclose(fout);
return 0;
}