Submission #1141103

#TimeUsernameProblemLanguageResultExecution timeMemory
1141103FaggiCrayfish scrivener (IOI12_scrivener)C++20
100 / 100
405 ms71928 KiB
#include <iostream>
#include <vector>

using namespace std;

const int MAXN=1e6+1;
const int LOG=22;

int ti[MAXN][LOG], let[MAXN];

pair<int,int>times[MAXN];

int tim=1, lets=0,ant=0,act, ta=0;

char txt[MAXN];

void Init()
{

}

void update(int tim)
{
    for(int i=1; i<LOG; i++)
    {
        ti[tim][i]=ti[ti[tim][i-1]][i-1];
    }
}

int Undo(int v, int k) {
    for (int i = 0; i < LOG; ++i) {
        if (k & (1 << i)) {
            v = ti[v][i];
            if (v == -1) break;
        }
    }
    return v;
}

vector<int>ord={0}, tam={0};

void TypeLetter(char L)
{
    ti[tim][0]=ant;
    update(tim);
    ant=tim;
    txt[lets]=L;
    let[tim]=lets;
    lets++;
    ord.push_back(tim);
    tam.push_back(ta+1);
    ta++;
    tim++;
}
void UndoCommands(int U)
{
    act=ord[int(ord.size())-(U+1)];
    ant=act;
    ta=tam[int(tam.size())-(U+1)];
    ord.push_back(act);
    tam.push_back(ta);
}

char GetLetter(int P)
{
    P++;
    int sub=tam[int(tam.size())-1]-P;
    int pos=Undo(ant, sub);
    return txt[let[pos]];
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...