Pagini recente » Cod sursa (job #524570) | Cod sursa (job #2641729) | Cod sursa (job #2567718) | Cod sursa (job #2610061) | Cod sursa (job #2632541)
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
#define MAXLENGTH 100000
ifstream in("nums.in");
ofstream out("nums.out");
struct node{
private:
node*children[10];
bool isEnd;
int digit;
int under;
public:
void setEnd(){
isEnd=true;
}
void setChild(int index,node*child){
children[index]=child;
}
void incrementUnder(){
under++;
}
int getUnder() const{
return under;
}
node* getChild(int index) const{
return children[index];
}
bool hasChild(int index) const {
return children[index];
}
bool isEnding() const {
return isEnd;
}
int getDigit() const{
return digit;
}
node(int data):isEnd(false),digit(data),under(0){
for(int i=0;i<10;i++)
children[i]=nullptr;
}
};
void addString(node*root,const std::string&to_add){
node*current=root;
vector<node*>passed;
for(char a:to_add){
passed.push_back(current);
int index=a-'0';
if(!current->hasChild(index)){
node*next =new node(index);
current->setChild(index,next);
}
current=current->getChild(index);
}
if(!current->isEnding()){
current->setEnd();
current->incrementUnder();
for(node*path:passed){
path->incrementUnder();
}
}
}
node*roots[MAXLENGTH+1];
void findOrder(int index){
int i=1;
for(i=1;i<=MAXLENGTH;i++){
if(roots[i]->getUnder()>=index)
break;
index-=roots[i]->getUnder();
}
node*current=roots[i];
string formed;
while(!current->isEnding()){
for(int i=0;i<10;i++){
if(current->hasChild(i)){
node*child=current->getChild(i);
if(child->getUnder()>=index){
current=child;
formed+='0'+child->getDigit();
break;
}
index-=child->getUnder();
}
}
}
out<<formed<<'\n';
}
void read(){
for(int i=0;i<MAXLENGTH;i++)
roots[i]=new node(0);
int query_count,type,order;
string aux;
in>>query_count;
for(int i=0;i<query_count;i++){
in>>type;
if(type==1){
in>>aux;
addString(roots[aux.length()],aux);
}
else{
in>>order;
findOrder(order);
}
}
}
int main(){
read();
return 0;
}