Cod sursa(job #918481)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 21:52:17
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#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)
    {
        return ( a.s.size() == b.s.size() ) ? a.s < b.s : 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;
}