Cod sursa(job #1687925)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 13 aprilie 2016 09:58:02
Problema Nums Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 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;

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.size()<b.F.size());
    int x=a.F.compare(b.F);
    if(x==0) return (a.S<b.S);
    return (x<0?1:0);
}

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;
             a.push_back({A,i});
         }
         else f>>t[i];
    }

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

    for(i=0; i<a.size(); ++i)
        if(i && a[i].F==a[i-1].F) ord[a[i].S]=0;
        else 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;
}