Cod sursa(job #2339897)

Utilizator Carol_LucaCarol Luca Carol_Luca Data 9 februarie 2019 15:19:22
Problema Nums Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include<bits/stdc++.h>

#define updType pair<pair<int,string>,int >

using namespace std;



const int maxN=(1e5)+5;

int x,op;

string s;

vector<updType> M;

int pos[maxN];

char str[maxN];



int n;

class Aint

{

    private:

    int v[4*maxN+5];

    public:

    void update(int nod,int st,int dr,int pos,int val)

    {

        if(st==dr)

        {

            v[nod]=1;

            return;

        }

            else

        {

            int mid=(st+dr)>>1;

            if(pos<=mid) update(nod*2,st,mid,pos,val);

                else update(2*nod+1,mid+1,dr,pos,val);

            v[nod]=v[2*nod]+v[2*nod+1];

        }

    }

    int query(int nod,int st,int dr,int k)

    {

        if(st==dr)

            return st;

        int mid=(st+dr)>>1;

        if(v[2*nod]>=k) return query(2*nod,st,mid,k);

            else return query(2*nod+1,mid+1,dr,k-v[2*nod]);

    }

}A;





int link[maxN];



ifstream fin("nums.in");

ofstream fout("nums.out");



int main()

{





    fin>>n;



    int y=0;



    for(int i=1;i<=n;i++)

    {

        fin>>x;

        fin>>s;



       // printf("%s\n",s);

        if(x==1)

            M.push_back(make_pair(make_pair((int)s.size(),s),++y));

    }







    int cnt=1,sz=(int)M.size();



    sort(M.begin(),M.end());



   // cerr<<M[0].first.second<<'\n';



    for(int i=0;i<sz;i++)

    {

        if(i)

        {

            if(M[i].first.first!=M[i-1].first.first)

            {

                cnt++;

            }

                else

            if(M[i].first.second!=M[i-1].first.second) cnt++;

        }

        pos[M[i].second]=cnt;

        link[cnt]=i;

    }



    fin.close();

    ifstream fin("nums.in");





    cnt=0;

    fin>>n;

    for(int i=1;i<=n;i++)

    {

        fin>>op;

        if(op==1)

        {



            fin>>str+1;

            cnt++;

            A.update(1,1,sz,pos[cnt],1);

        }

            else

        {

            int q;

            fin>>q;

            y=A.query(1,1,sz,q);

            fout<<M[link[y]].first.second<<'\n';

        }

    }





    return 0;

}