Cod sursa(job #930268)

Utilizator stefanzzzStefan Popa stefanzzz Data 27 martie 2013 15:46:28
Problema Nums Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define MAXN 100005
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");

struct numar{
    vector<short int> c;};

int n,query[MAXN],nrnum,ind[MAXN],poz[MAXN],tip,y,ai[4*MAXN],mij,sol;
numar x[MAXN];
char s[MAXN];

bool Comp(int a,int b);
void update(int nod,int st,int dr);
int solve(int nod,int st,int dr);

int main()
{
    int i,j;
    f>>n;
    for(i=1;i<=n;i++){
        f>>tip;
        if(tip){
            ind[++nrnum]=i;
            f.getline(s,MAXN,'\n');
            for(j=1;s[j]!='\0';j++)
                x[i].c.push_back(s[j]-'0');}
        else
            f>>query[i];}
    sort(ind+1,ind+nrnum+1,Comp);
    for(i=1;i<=nrnum;i++)
        poz[ind[i]]=i;
    for(i=1;i<=n;i++){
        if(query[i]){
            y=query[i];
            sol=solve(1,1,n);
            sol=ind[sol];
            for(j=0;j<x[sol].c.size();j++)
                g<<x[sol].c[j];
            g<<'\n';}
        else{
            y=poz[i];
            update(1,1,n);}}
    f.close();
    g.close();
    return 0;
}

bool Comp(int a,int b){
    short int i;
    if(x[a].c.size()!=x[b].c.size())
        return x[a].c.size()<x[b].c.size();
    for(i=0;i<x[a].c.size()&&x[a].c[i]==x[b].c[i];i++);
    //if(i==x[a].c.size()){
    return x[a].c[i]<x[b].c[i];}

void update(int nod,int st,int dr){
    if(st==dr){
        ai[nod]++;
        return;}
    mij=(st+dr)/2;
    if(y<=mij)
        update(2*nod,st,mij);
    else
        update(2*nod+1,mij+1,dr);
    ai[nod]=ai[2*nod]+ai[2*nod+1];}

int solve(int nod,int st,int dr){
    if(st==dr)
        return st;
    mij=(st+dr)/2;
    if(ai[2*nod]<y){
        y-=ai[2*nod];
        return solve(2*nod+1,mij+1,dr);}
    else
        return solve(2*nod,st,mij);}