Cod sursa(job #2221969)

Utilizator patcasrarespatcas rares danut patcasrares Data 16 iulie 2018 11:37:56
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<fstream>
#include<iostream>
#include<algorithm>
#include<cstring>
#define DN 100005
#include<deque>
#define x first
#define y second
using namespace std;
ifstream fin("nums.in");
ofstream fout("nums.out");
int n,nr,r[DN],st,dr,mij,sum[4*DN],poz,k;
string b;
pair<int,int>q[DN];
pair<int,pair<string,int> >s[DN];
deque<int>d;
void update(int nod,int st,int dr)
{
    if(st==dr)
    {
        sum[nod]=1;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        update(2*nod,st,mij);
    else
        update(2*nod+1,mij+1,dr);
    sum[nod]=sum[2*nod]+sum[2*nod+1];
}
int query(int nod,int st,int dr)
{
    if(st==dr)
        return st;
    int mij=(st+dr)/2;
    if(sum[2*nod]>=k)
        return query(2*nod,st,mij);
    k-=sum[2*nod];
    return query(2*nod+1,mij+1,dr);
}
int main()
{
    fin>>n;
    for(int h=1;h<=n;h++)
    {
        fin>>q[h].x;
        if(q[h].x==1)
        {
            nr++;
            fin>>b;
            s[nr]={b.size(),{b,h}};
            continue;
        }
        fin>>q[h].y;
    }
    sort(s+1,s+nr+1);
    for(int i=1;i<=nr;i++)
        if(s[i].y.x!=s[i-1].y.x)
            r[s[i].y.y]=i;
    for(int i=1;i<=n;i++)
    {
        if(q[i].x==1)
        {
            if(r[i])
            {
                poz=r[i];
                update(1,1,n);
            }
            continue;
        }
        k=q[i].y;
        fout<<s[query(1,1,n)].y.x<<'\n';
    }
}