Cod sursa(job #1835791)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 27 decembrie 2016 14:03:11
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#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;
}