Cod sursa(job #1315618)

Utilizator george_stelianChichirim George george_stelian Data 12 ianuarie 2015 22:30:36
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>
#include <string>
#include <vector>
#include <map>

using namespace std;

struct str
{
    int tip,x;
}v[100010];
string sir[100010];
int aib[100010],norm[100010],n,logn,nr;

class trie
{
    public:
        void insert(string sir,int x,int y)
        {
            node *nod=rad;
            int lim=sir.size();
            for(int i=0;i<lim;i++)
            {
                if(nod->fiu.count(sir[i])==0) nod->fiu[sir[i]]=new node();
                nod=nod->fiu[sir[i]];
            }
            nod->poz.push_back(x);
            nod->m=y;
        }

        void solve()
        {
            solve(rad);
        }
    private:
        struct node
        {
            int m;
            vector<int> poz;
            map<char,node*> fiu;
            node()
            {
                m=0;
                poz=vector<int>();
                fiu=map<char,node*>();
            }
        };
        node *rad=new node();

        void solve(node *nod)
        {
            if(nod->poz.size())
            {
                nr++;
                norm[nr]=nod->m;
                for(vector<int>::iterator it=nod->poz.begin();it!=nod->poz.end();it++) v[*it].x=nr;
                return;
            }
            for(map<char,node*>::iterator it=nod->fiu.begin();it!=nod->fiu.end();it++) solve(it->second);
        }
}t[100010];

void aib_update(int i)
{
    for(;i<=n;i+=i&(-i)) aib[i]++;
}

int cautbin(int s)
{
    int x=0;
    for(int i=logn;i>=0;i--)
        if(x+(1<<i)<=n && s>aib[x+(1<<i)])
        {
            x+=1<<i;
            s-=aib[x];
        }
    return x+1;
}

int main()
{
    //freopen("nums.in", "r", stdin);
    //freopen("nums.out", "w", stdout);
    ifstream f("nums.in");
    ofstream g("numas.out");
    int m=0;
    //scanf("%d",&n);
    f>>n;
    for(logn=1;1<<(logn+1)<=n;logn++);
    for(int i=1;i<=n;i++)
    {
        //scanf("%d",&v[i].tip);
        f>>v[i].tip;
        if(v[i].tip)
        {
            //char numar[100010];
            //scanf("%s",numar);
            //sir[++m]=numar;
            f>>sir[++m];
            t[sir[m].size()].insert(sir[m],i,m);
        }
        else /*scanf("%d",&v[i].x);*/f>>v[i].x;
    }
    for(int i=1;i<=100000;i++)
        t[i].solve();
    for(int i=1;i<=n;i++)
        if(v[i].tip) aib_update(v[i].x);
        else
        {
            int x=cautbin(v[i].x);
            //printf("%s\n",sir[norm[x]].c_str());
            g<<sir[norm[x]]<<"\n";
        }
    return 0;
}