Cod sursa(job #2209606)

Utilizator stefdascalescuStefan Dascalescu stefdascalescu Data 3 iunie 2018 21:12:34
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");
int n,cate;
int aib[100002];
bool prs[100002];
struct qx
{
    int tip,pos,poss,pi;
    string x;
};
qx v[100002];
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(qx a, qx b)
{
    if(a.x.size()!=b.x.size())
        return a.x.size()<b.x.size();
    for(int i=0;i<a.x.size();++i)
        if(a.x[i]!=b.x[i])
            return a.x[i]<b.x[i];
    if(a.tip)
    return a.tip<b.tip;
}
bool cmp2(qx a, qx b)
{
    return a.pi<b.pi;
}
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;
            v2[cate].x=v[i].x;
        }
        else
            f>>v[i].pos;
        v[i].pi=i;
    }
    sort(v+1,v+n+1,cmp);
    int c2=0;
    for(int i=1;i<=n;++i)
    {
        if(i==1)
            v2[++c2].x=v[i].x;
        else
            if(v[i].x!=v2[c2].x)
                v2[++c2].x=v[i].x;
    }
    cate=c2;
    int cc=1;
    for(int i=1;i<=n;++i)
    {
        if(v[i].x!=v2[cc].x)
            ++cc;
        v[i].poss=cc;
    }
    sort(v+1,v+n+1,cmp2);
    for(int i=1;i<=n;++i)
    {
        if(v[i].tip==1)
        {
            if(!prs[v[i].poss])
                add(v[i].poss),prs[v[i].poss]=1;
        }
        else
        {
            int b=1;
            int e=cate;
            while(b<=e)
            {
                int mid=(b+e)/2;
                int valx=compute(mid);
                int valy=compute(mid-1);
                if(valx==v[i].pos && valy<v[i].pos)
                {
                    g<<v2[mid].x<<'\n';
                    break;
                }
                if(valx>v[i].pos)
                    e=mid-1;
                else
                    b=mid+1;
            }
        }
    }
    return 0;
}