Cod sursa(job #2209613)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 3 iunie 2018 21:41:53
Problema Nums Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");
int n;
int aib[100002];
bool prs[100002];
int arr[100002],pos[100002];
struct qx
{
    int tip,pos,ps;
    string x;
};
qx v[100002];
int cate=0;
struct str
{
    string x;
};
str v2[100002];
void add(int nod)
{
    for(;nod<=cate;nod+=(nod&(-nod)))
        aib[nod]++;
}
int compute(int nod)
{
    int sol=0;
    for(;nod;nod-=(nod&(-nod)))
        sol+=aib[nod];
    return sol;
}
bool cmp(int a, int b)
{
    if(v2[a].x.size()!=v2[b].x.size())
        return v2[a].x.size()<v2[b].x.size();
    for(int i=0;i<v2[a].x.size();++i)
        if(v2[a].x[i]!=v2[b].x[i])
            return v2[a].x[i]<v2[b].x[i];
}
bool cmp2(int a, int b)
{
    if(v2[a].x.size()!=v2[b].x.size())
        return 1;
    for(int i=0;i<v2[a].x.size();++i)
        if(v2[a].x[i]!=v2[b].x[i])
            return 1;
    return 0;
}
int main()
{
    f>>n;
    for(int i=1;i<=n;++i)
    {
        f>>v[i].tip;
        if(v[i].tip==1)
        {
            f>>v[i].x;
            ++cate;
            v[i].ps=cate;
            arr[cate]=cate;
            v2[cate].x=v[i].x;
        }
        else
            f>>v[i].pos;
    }
    sort(arr+1,arr+cate+1,cmp);
    int x=1;
    for(int i=2;i<=cate;++i)
        if(cmp2(arr[i],arr[x])!=0)
            arr[++x]=arr[i];
    for(int i=1;i<=x;++i)
        pos[arr[i]]=i;
    for(int i=1;i<=n;++i)
    {
        if(v[i].tip==1)
        {
            if(pos[v[i].ps]!=0)
                add(pos[v[i].ps]);
            continue;
        }
        int b=1;
        int e=x;
        while(b<=e)
        {
            int m=(b+e)/2;
            int valy=compute(m);
            int vij=compute(m-1);
            if(valy>=v[i].pos && vij<v[i].pos)
            {
                g<<v2[arr[m]].x<<'\n';
                break;
            }
            if(valy>=v[i].pos)
                e=m-1;
            else
                b=m+1;
        }
    }
    return 0;
}