Cod sursa(job #2166476)

Utilizator DavidLDavid Lauran DavidL Data 13 martie 2018 17:19:56
Problema Nums Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <string>
#include <algorithm>
#define MAX 100002
using namespace std;
ifstream fi("nums.in");
ofstream fo("nums.out");

int Q,m;
string str;

inline int lsb(int x)
{
    return x&(-x);
}

struct elem
{
    string s;
    int idx;
} e[MAX];

bool cmp(const elem a,const elem b)
{
    if (a.s.size()==b.s.size())
        return a.s<b.s;
    return a.s.size()<b.s.size();
}

struct query
{
    int t,kth,poz;
} q[MAX];

bool F[MAX];
int A[MAX];

void update(int poz)
{
    for(int i=poz; i<=Q; i+=lsb(i))
        A[i]++;
}

int qqquery(int k){
    int i=0,p=(1<<16);
    while (p)
    {
        if(i+p<=m && A[i+p]<k)
        {
            i+=p;
            k-=A[i];
        }
        p>>=1;
    }
    return i+1;
}

void queries()
{
    for(int i=1; i<=Q; i++)
    {
        if(q[i].t && !F[q[i].poz])
        {
            update(q[i].poz);
            F[q[i].poz]=1;
        }
        if(!q[i].t)
        {
            int poz=qqquery(q[i].kth);
            fo<<e[poz].s<<"\n";
        }
    }
}

int main(){
    /*------Read Input----*/
    fi>>Q;
    for(int i=1; i<=Q; i++)
    {
        fi>>q[i].t;
        if(q[i].t)
        {
            fi>>e[++m].s;
            e[m].idx=i;
        }
        else fi>>q[i].kth;
    }

    sort(e+1,e+m+1,cmp);
    for(int i=1; i<=m; i++){
        int j=i;
        while(e[i].s==e[j].s && j<=m)
        {
            q[e[j].idx].poz=i;
            j++;
        }
        i=j-1;
    }
    queries();
    return 0;
}