#include int n = 1; void add_node(int a) { // Pod vrchol a přivěs vrchol n na hranu délky 1. } void spread_edge(int a, int b) { // Hranu vedoucí do vrcholu a natáhni o b. } long long ask_len(int a) { // Vrať vzdálenost vrcholu a od kořene. } unsigned int read_u32() { // Přečte 32-bitové little-endian číslo. unsigned char x[4]; fread(x, 1, sizeof(x), stdin); return x[0] | (x[1] << 8) | (x[2] << 16) | (x[3] << 24); } unsigned int read_u24() { // Přečte 24-bitové little-endian číslo. unsigned char x[3]; fread(x, 1, sizeof(x), stdin); return x[0] | (x[1] << 8) | (x[2] << 16); } int main() { int q = read_u32(); long long int o = 0; for (int i = 0; i < q; i++) { int a = read_u24(); int b = getchar(); int x = (a + o) % (3 * n); if (x < n) { add_node(x); n++; } else if (x < 2*n) { spread_edge(x - n, b); } else { o = ask_len(x - 2*n); } } printf("%lld\n", o); return 0; }