Cod sursa(job #1315632)

Utilizator george_stelianChichirim George george_stelian Data 12 ianuarie 2015 22:43:52
Problema Nums Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <fstream>
#include <string>
#include <vector>
#include <map>

using namespace std;

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

class trie
{
    public:
        trie():
            rad(new node()) {}

        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;

        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()
{
    ifstream f("nums.in");
    ofstream g("nums.out");
    int m=0;
    f>>n;
    for(logn=1;1<<(logn+1)<=n;logn++);
    for(int i=1;i<=n;i++)
    {
        f>>v[i].tip;
        if(v[i].tip)
        {
            f>>sir[++m];
            if(!vaz[sir[m].size()])
            {
                t[sir[m].size()]=trie();
                vaz[sir[m].size()]=1;
            }
            t[sir[m].size()].insert(sir[m],i,m);
        }
        else f>>v[i].x;
    }
    for(int i=1;i<=100000;i++) if(vaz[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);
            g<<sir[norm[x]]<<"\n";
        }
    return 0;
}