Cod sursa(job #1317568)

Utilizator Tester100Tester Tester100 Data 14 ianuarie 2015 23:24:13
Problema Nums Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <iostream>
#include <unordered_map>
#include <vector>
#include <set>
#include <string>
#include <algorithm>

using namespace std;
const int NMAX = 100002;
int op[NMAX], index[NMAX], ind[NMAX];
string s[NMAX];
unordered_map < string,int >M;
int v[NMAX];
struct cmp
{
    bool operator ()(const int i,const int j)
    {
        return s[i] < s[j];
    }
};
set < int,cmp >S[NMAX];
struct AINT{
    vector <int > aint;
    int n, Step;
    AINT()
    {
        n = 0;
        aint.clear();
    }
    AINT(const int _n)
    {
        n = _n;
        aint.resize(4*n+1);
    }
    inline void Update(const int node,const int Left,const int Right,const int pos)
    {
        if(Left==Right)
        {
            ++aint[node];
            return ;
        }
        int mid = (Left+Right)/2;
        if(pos<=mid)
            Update(2*node,Left,mid,pos);
        else
            Update(2*node+1,mid+1,Right,pos);
        aint[node] = aint[2*node]+aint[2*node+1];
    }
    inline int Query(const int node,const int Left,const int Right,const int S)
    {
        if(Left==Right)
            return Left;
        int mid = (Left+Right)/2;
        if(aint[2*node] >= S)
            return Query(2*node,Left,mid,S);
        return Query(2*node+1,mid+1,Right,S-aint[2*node]);
    }
    inline void Update(const int pos)
    {
        Update(1,1,n,pos);
    }
    inline int search(const int s)
    {
        return Query(1,1,n,s);
    }

};
int main()
{
    freopen("nums.in","r",stdin);
    freopen("nums.out","w",stdout);
    cin.sync_with_stdio(false);
    int n;
    cin >> n;
    AINT A(NMAX);
    for(int i=1;i<=n;++i)
    {
        cin >> op[i];
        if(op[i]==1){
            cin >> s[i];
            int L = s[i].length();
            if(S[L].find(i)!=S[L].end())
                continue;
            S[L].insert(i);
        }
        else
            cin >> index[i];
    }
    int j = 0;
    for(int i=1;i<=100000;++i){
        for(auto x=S[i].begin();x!=S[i].end();++x){
                v[++j] = *x;
                ind[*x] = j;
            }
        S[i].clear();
    }
    for(int i=1;i<=n;++i)
        if(op[i]==1){
            cin >> s[i];
            int L = s[i].length();
            if(S[L].find(i)!=S[L].end())
                continue;
            A.Update(ind[i]);
        }
        else{
            int L = A.search(index[i]);
            cout<<s[v[L]]<<"\n";
        }
    return 0;
}