Cod sursa(job #2163541)

Utilizator DavidLDavid Lauran DavidL Data 12 martie 2018 18:47:09
Problema Nums Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <fstream>
#include <string>
#include <algorithm>
#include <map>
#define MAX 100005
using namespace std;
ifstream fi("nums.in");
ofstream fo("nums.out");

int n;
int A[MAX];
string query[MAX];
string aux[MAX];
int k;
int q[MAX];
map <string,int> cor;

bool cmp(string a,string b)
{
    if (a.size()>b.size())
        return 0;
    if (a.size()<b.size())
        return 1;
    for (int i=0; i<a.size(); i++)
        if (a[i]<b[i])
            return 1;
        else if (a[i]>b[i])
            return 0;
    return 1;
}

void update(int poz,int val)
{
    for (int i=poz; i<=n; i+=(i&(-i)))
        A[i]+=val;
}

int sum(int poz)
{
    int rez=0;
    for (int i=poz; i>0; i-=(i&(-i)))
        rez+=A[i];
    return rez;
}

int main()
{
    fi>>n;
    for (int i=1; i<=n; i++)
    {
        int p;
        fi>>p;
        if (p==0)
        {
            fi>>q[i];
        }
        else
        {
            string x;
            fi>>x;
            if (!cor[x])
            {
                query[++k]=x;
                aux[k]=query[k];
                cor[x]=1;
            }

        }
    }

    sort(query+1,query+k+1,cmp);

    for (int i=1; i<=k; i++)
        cor[query[i]]=i;

    /*for (auto x: cor)
        fo<<x.first<<": "<<x.second<<"\n";
    return 0;*/

    int ajuns=0;
    for (int i=1; i<=n; i++)
    {
        if (q[i]==0) /// nr nou
        {
            ajuns++;
            int poz=cor[aux[ajuns]];
            update(poz,1);
        }
        else /// query
        {
            int st=0,dr=n;
            while (dr-st>1)
            {
                int mij=(st+dr)/2;
                if (sum(mij)<q[i])
                    st=mij;
                else
                    dr=mij;
            }
            string rez=query[dr];
            fo<<rez<<"\n";
        }
    }

    return 0;
}