Cod sursa(job #1679662)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 8 aprilie 2016 09:51:24
Problema Nums Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_set>
#define tractoree pair< string,int >
#define F first
#define S second

using namespace std;

ifstream f("nums.in");
ofstream g("nums.out");

const int N = (1e5)+5;

unordered_set<string> Set;
int i, t[N], n, ord[N], aib[N];
vector< tractoree > a;
string A;

bool cmp(tractoree a,tractoree b)
{
     if(a.F.size()==b.F.size()) return (a.F<b.F);
     return (a.F.size()<b.F.size());
}

inline void update(int x)
{
     for(; x<=a.size(); x+=(x&(-x))) ++aib[x];
}

inline int query(int x)
{
     int ans=0;
     for(; x; x-=(x&(-x))) ans+=aib[x];
     return ans;
}

void bs(int p)
{
    int st=1,dr=a.size(),mij;
    while(st<=dr)
    {
         mij=((st+dr)>>1);
         if(query(mij)<p) st=mij+1;
         else dr=mij-1;
    }
    g<<a[dr].F<<'\n';
}

int main()
{
    f>>n;
    for(i=1; i<=n; ++i)
    {
         f>>t[i];
         if(t[i])
         {
             f>>A;
             t[i]=0;
             if(Set.find(A)==Set.end())
             {
                 a.push_back({A,i});
                 Set.insert(A);
             }
         }
         else f>>t[i];
    }

    sort(a.begin(), a.end(), cmp);

    for(i=0; i<a.size(); ++i)
        ord[a[i].S]=i+1;

    for(i=1; i<=n; ++i)
    if(t[i]) bs(t[i]);
    else
        if(ord[i]) update(ord[i]);

    return 0;
}