Cod sursa(job #760393)

Utilizator S7012MYPetru Trimbitas S7012MY Data 21 iunie 2012 11:05:34
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#define DN 100005
#define x first
#define y second
using namespace std;

int n,ind[DN],sz,aib[DN];
pair<int,string> op[DN];

bool cmp(const int &a, const int &b) {
    if(!op[a].x) return 0;
    if(!op[b].x) return 1;
    if(op[a].y.size()==op[b].y.size()) return op[a].y.compare(op[b].y)<0;
    return op[a].y.size()<op[b].y.size();
}

inline int lsb(int n) {
    return (n&(n-1))^n;
}

void update(int x) {
    for(int i=x; i<=n; i+=lsb(i)) ++aib[i];
}

int search(int x) {
    int i,pd;
    for(pd=1;pd<n;pd<<=1);
    for(i=0;pd;pd>>=1) if(i+pd<=n && x>=aib[i+pd]) {
        i+=pd; x-=aib[i];
        if(0==x) return i;
    }
}

int conv(string s) {
    int r=0;
    for(int i=0; i<s.size(); ++i)
        r=r*10+s[i]-'0';
    return r;
}

int main()
{
    ifstream f("nums.in");
    ofstream g("nums.out");
    f>>n;
    for(int i=1; i<=n; ++i) {
        f>>op[i].x>>op[i].y;
        ind[i]=i;
        if(op[i].x) ++sz;
    }
    sort(ind+1,ind+n+1,cmp);
    for(int i=1; i<=n; ++i) {
        if(op[i].x) update(ind[i]);
        else {
            int unde=search(conv(op[i].y))-1;
            g<<op[ind[unde]].second<<'\n';
        }
    }
    return 0;
}