# IOI 2024, Alexandria, Egypt

## Introduction

The 36th International Olympiad in Informatics (IOI) 2024 was held in Alexandria, Egypt from 1 September to 8 September. The Malaysian team comprised Lim Chang Jun, Khor Yan Xun, Isaac Hew Kai Sheng, and Loh Kwong Weng. The team leader was Amos Tan Li Sheng and the deputy leader was Vee Hua Zhi.

## Day 1: Arrival

We were all assigned to the same room, despite initially hearing that each would have only 2 or 3 beds. A team guide was appointed to help us navigate the university campus and ensure we were well taken care of throughout our stay. After settling in, we spent our first day exploring the campus and enjoying time at the Huawei Booth, which offered activities like table tennis, arcade basketball, and sudoku, along with refreshments.

## Day 2: Practice Contest & Opening Ceremony

### Chang Jun’s Perspective

The practice contest was a nightmare for me. Initially, I planned to use the keyboard provided by the organiser, but there’s a significant difference between the US and UK layouts, which are more common in Egypt. This threw off my muscle memory, especially with the shift key and several other symbols. Unfortunately, I hadn’t brought a backup keyboard, so I had no choice but to use the one provided.

We were then transferred to the Bibliotheca Alexandrina for the opening ceremony. Due to time constraints, we were told to eat on the bus, which was slightly inconvenient. The ceremony began shortly after we arrived, featuring speeches from distinguished guests and a few performances. The most interesting part was definitely the team introductions, where each contingent was mentioned and officially presented. Sadly, we weren’t able to tour the Bibliotheca as planned.

When I returned to the dormitory, I received great news: my team leaders, Amos and Hua Zhi, had Ubered around to find a store selling US keyboards and bought one for me. It turned out to be crucial, as subtask farming requires a lot of implementation.

Malaysia boleh!

## Day 3: Contest Day 1

### Isaac’s perspective:

As I entered the contest hall, I was afraid that this year’s problems would be as hard as last year’s, and that I would not be able to get a medal. I wanted to ensure I solved all the subtasks I could, so I wouldn’t fail as in IOI 2023.

After reading each of the problem statements, I decided to settle on problem 1, since it seemed to be impossible to get more than 10 points in P2, and problem 3’s statement was too confusing to understand at first.

To start, I attempted subtasks 1 to 5, when \(Q \le 5\). Sorting the artifacts by weight, I noticed that each group of artifacts with a difference at most \(D\) between the weight of each consecutive artifact could be paired up into boats completely, if there were an even number of them, otherwise an artifact with odd index within the group would be unpaired. I got only 23 points. Realising that certain even-indexed artifacts could also be skipped, I revised my solution, gaining the 67 points that I originally planned. To get the last 33 points, I sorted the queries by increasing values of \(D\), merging consecutive blocks of artifacts together when needed. This required much more implementation than the 67 point solution, but after a bit of debugging, I got my AC.

After P1 was done, I did subtask 1 of P2 for 10 points, then proceeded to P3, still wondering the rest of P2 was possible at all.

Problem 3 had another easy 10 point subtask that I immediately did, before moving to subtasks 4 and 5: \(W[i] \le 1\). As the weight for each node would be 0 or 1, I could separate the tree into subtrees composed of weight-1 nodes, where the weight-0 nodes would become leaves. Then a subtree with \(k\) nodes would contribute \(kL-R\) points, if \(R \le kL\). I gained my 18 points, moving on to subtasks 2 and 3. I implemented a solution using small-to-large merging, however it failed, not giving me any points.

Around 30 minutes before the contest ended, I realised that I misread problem 2: instead of being unable to control a different set of bits per packet, it was the same 15 indices of each packet that could not be transmitted properly. I encoded the controlled bits based on the bits the receiver knew to be secured. If the receiver didn’t know any, then I would just send all \(0\)s or all \(1\)s, and have the receiver record the majority of the bits. Rushing to write a solution, I managed to get one to work just 10 minutes before the end of the contest, getting me 49.61 points. I attempted to improve on this in the time I had, but in the end I couldn’t get my score any higher than that, even after submitting a solution 30 seconds after the contest had ended.

I scored 100 - 49.61 - 28 points, totalling 177.61 points, putting me just 6 points above the silver cutoff for day 1, which was 171.33 points. I thought about the 31 points on problem 3 that I had missed, that could have made my silver medal safer for day 2.

### Yan Xun’s perspective:

I started by reading all of the problem statements and writing down all the ideas I could think of in 5 minutes. I managed to quickly figure out the idea for the first subtasks for P1 and P2, and implemented them without much trouble. I did not know where to start on P3, and it looked like quite a few observations were needed to even get a single point on it.

I decided to spend some time on P2, as I usually do fairly well on communication problems. I was stuck for a while as I couldn’t think of a way to communicate the array C faster than 1 bit per query. (which would result in \(Q = 31 + 64 + 1\ \text{(for size of M)}\ = 95\), not an ideal score.) I then thought of the idea of using RNG to figure out the positions where \(C[i] = 1\). I generated a random integer between 0 and \(2^{25}-1\) for each position, and sent it using 25 queries. This meant that there would be a \(1/2^{25}\) chance for each position where \(C[i] = 1\) that it would get its assigned sequence of 25 bits right by pure chance (but this chance is really low given the number of test cases). I then tried a few different RNG seeds and managed to make a sequence of 23 bits work. At that time, the 2-hour mark was approaching, so I decided to move on to P1 which seemed much more doable than P3.

I solved subtask 2 of P1 pretty quickly, by observing that the answer is the same for all \(E[j] \ge 2\). By making a few more observations (notably if you sort by W, you’ll only ever need to pair two artifacts that have at most one other artifact between them; and you can split the array into ranges where \(W[i+1] - W[i] \le K\) for all \(i\), answer for that range is simply 0 if the number of elements is even, else you leave out one element with the smallest cost for doing so), I managed to solve each query in \(O(N)\) time, bringing my score to \(67\) points for the \(Q \le 5\) cases.

I immediately started attempting subtask 6, and realised that I just need to count the number of connected components with odd size (draw edges between two artifacts with difference \(\le D\)). I implemented a DSU and sorted the queries to solve everything in \(O(N \log N)\) time. By then, I had figured out that combining my solutions of subtasks 5 and 6 would give me the AC solution, but it was implementation heavy so I went to problem 3 first as there were only about 90 minutes left in the contest, and I still haven’t spent much time doing P3.

I thought of a greedy solution for subtask 1, but failed in implementing it after several attempts. With 45 minutes left in the contest, I decided to implement the AC solution to P1 (using 4 segment trees) and managed to get the AC in 30 minutes. I decided that my strategy would be to try P3 until there were 5 minutes left, then try to grab a few more points on P2 by reducing the number of bits and rerolling the seeds. I had no luck with P3 (turns out my implementation of the greedy algorithm was wrong), but managed to get 3 more points on P2 before running out of time (turns out the first seed I tried during the analysis mode session gave me another 1.7 points).

My final score for the day was 100 - 42.27 - 0. I was quite satisfied with the result as I made the bronze cutoff by 18 points, although I could’ve definitely grabbed some points on P3 if my P1 implementation was faster.

### Kwong Weng’s perspective:

There are 3 problems, nile, messages and tree. I started with tree because I like to solve graph problems. The problem felt quite difficult so I skipped to nile. Soon I manage to find an \(O(N)\) solution per query by looking at separate chunks of weights, which give me 67 points. Not long after I got the full solution which requires multiple segment trees and solving queries in increasing order, which feel quite scary to implement.

I decided to skip to messages first. The 29 pts solution is quite easy, by noticing that we can recover one bit per packet because there are more fixed bits than unfixed bits. In 31 queries I could get all fixed bits and use them to transmit the message. After some time, I managed to find an improvement - we can recover at least 8 bits from at least the left or right half, then use them to recover all fixed bits. This approach pushed my score to 47.63.

Having about 2 hours left, I decided to code up the full solution for Nile, which took up 30-40 minutes. After that I continued trying Messages but with no progress :(

With an hour left, I decide on putting all my remaining time on p3. I got greedy subtask quickly for 10 points. While the greedy solution is useless without the special condition, it does give me insights for subtask 2,3 - each leaf vertex should have coefficient \(L\), which each other vertex acts to make the coefficient sum of its subtree at most R, so their coefficient should be nonpositive. The remaining part is to use smaller weight vertices as much as possible, using a set. Merging sets would take \(O(N^2)\) to solve subtask 2, but this can be easily optimised to \(O(N\log N)\) using small-to-large merging. However, my code got WA on the first try and I didn’t manage to fix my code in time :(

In the end, I got 100 - 47.63 - 10 for nile, message and tree. The problems this year are quite nice just like past few years, with Nile on the easier side, Message being a cool interactive problem with a good partial scoring system, and tree on the difficult side.

This was the highest score I have gotten in a day of IOI so I am fairly happy with my result (except for the 31 pts subtask for tree that I missed at the end). Nevertheless, I hope that I will do better on Day 2 :)

### Chang Jun’s perspective:

When the contest began, I quickly skimmed through the problem statements to gauge their difficulties. After some time, I identified a doable subtask in question 2, which earned me the first 10 points. I then switched to question 1 and started working on a few subtasks, gradually making key observations that helped improve my score. I paused at 67 points for question 1 and shifted my focus to question 3. Using a greedy approach, I managed to solve the first two subtasks, bringing my overall score to over 100 points. Feeling satisfied, I took a brief break to reassess which problem to tackle next.

After the break, I considered trying an RNG solution for question 2, hoping to trick the grader, but unfortunately, it didn’t work. I then returned to question 1 and implemented another subtask, raising my score to 82 points. Though I was close to a full solution, I decided that the remaining 18 points might not be worth the effort, so I shifted back to question 3. The optimal solution for question 3 involved small-to-large merging, but the implementation was highly complex. It took me 1.5 hours to debug, and the issue turned out to be something minor.

With the contest nearing its end, I quickly revisited question 2, tried a few more RNG approaches, but again, they failed. In the final moments, I thought of a deterministic method that could have earned me additional points, but with only five minutes left, I couldn’t implement it in time. My final score was 82-10-41, which placed me just above the bronze cutoff. While I’m content with the performance overall, I have some regrets about not achieving a higher score on question 2, especially since many contestants around my ranking earned at least 20 more points there.

## Day 4: Excursion Day 1

For our first excursion, we headed to a beach along the Mediterranean Sea. The weather was hot, with bright sunlight, so we applied sunscreen for protection. While many participants from other countries quickly changed into swimsuits and began enjoying the sea, most of our team had no plans to swim and hadn’t brought swimsuits. There were also other water activities available, like banana boats and jet skis, but they were offered at sky-high prices.

After spending some time playing cards, we decided to explore the area around the beach. During our walk, we came across an artificial waterfall where geese were swimming. We later took a break under a wooden shade, enjoying some ice cream with a uniquely chewy texture. It was a refreshing and relaxing way to end our little adventure before heading back to the beach.

## Day 5: Contest Day 2

### Isaac’s perspective:

For day 1, I had gotten a low silver performance. Before the contest, I was nervous that I would not do as well on day 2 as day 1, and end up getting bronze.

I started on problem 2, mosaic, as problem 1 was a string problem, which I did not know any algorithms for. Problem 3, being an interactive problem, looked like I could get some easy points with enough thinking, but problem 2 had some very easy subtasks. I immediately grabbed 22 points from subtasks 1, 2, and 4, using brute force and prefix sums. I proceeded to subtask 6, as its constraints implied each query only took up one cell. A single 1 would force both the cells to the right and below it to be 0, which would in turn force the cell below and right of the 1 to also be a 1. So the 1s would form diagonal lines, as long as they were 2 or 3 cells apart. I could ensure that by working down the grid to the third row and column, as the second row/column would not have two 1s in a row, and the third row/column would not have three 0s in a row. So by then, the 1s would be correctly spaced. A query would then just find which diagonal line the cell lies on. I gained another 22 points.

Knowing the construction, I then went for an AC, which involved quite a bit of implementation of prefix sums, keeping track of how many times each diagonal is counted, but my submission ended up only getting 12 points.

I moved on to problem 3, first attempting subtask 4, using binary search to find the colour of each vertex, yielding 24 points. It was then when I finally found my mistake in P2 (not multiplying a prefix sum) and got AC.

I then got my 3 points from problem 1, not able to solve any subtask of the problem other than that. I worked down the subtasks of problem 3, eventually ending up with 64 points, from every subtask but the last.

There were now 30 minutes left of the contest, and I felt like I couldn’t scrape any more points from any of the problems, so I ended up waiting until the end of the contest, hoping that I would remain at silver when the 30 minutes were up.

My final score for day 2 was 3 - 100 - 64, which was 167 points total for day 2. This put me at 344.61 points total, which was firmly within the silver medal range, at 50th place on the CMS ranking list.

I later found out that I was only 16 points from the gold cutoff, and if I got either 82 points for P6 or 59 points for P3, I would already have gotten gold.

### Yan Xun’s perspective:

Similar to Day 1, I started by reading all of the problem statements and writing down all the ideas I could think of in 5 minutes. I couldn’t really think of any observations for P1, P2 had a lot of free points, and P3 looked like a generic interactive problem where spamming binary search in the right places would give an AC or really high score.

I decided to implement the trivial subtasks of all three problems quickly to make sure I understood the problem correctly. I first grabbed the first subtask of P3, then grabbed subtasks 1, 2 and 4 of P2 with 2D prefix sums, then the first subtask of P1.

After grabbing some easy subtasks, I decided to work on P1 as it looked like something that was deceivingly doable, and wanted to get it done and over with. I spent about 40 minutes on the problem and did not make many useful observations, and concluded that it would probably be a problem with a really low average score (turns out almost everyone only got 3 points on it).

I decided to attempt P3 next. After about an hour, I figured out a solution to get half credit for the complete graph subtask, by recursively splitting a range of nodes in half, solving for each of the ranges and merging them. I then quickly realised I could binary search on the colour of a node, so I combined it with my previous merge sort-ish solution but exceeded the query limit. I did a couple optimizations to my merge sort, but I still exceeded the query limit. There were only 2 hours left, so I moved on to P2 to make sure I didn’t miss any really easy points.

I proceeded to quickly grab the two other easy subtasks (3 and 5). I initially misread subtask 6 as \(T_i = T_j, L_i = L_j\) and so on for all \((i, j)\), in other words \(Q = 1\). After brute forcing some cases on paper, I realised a consistent diagonal carrying pattern beyond row 3. For some reason I observed from my brute force case that the diagonal carrying starts at column 2 (in hindsight clearly the diagonal carrying has to be symmetrical). To solve the imaginary \(Q = 1\) subtask, I flattened the third row and second column of the grid into an array, and shifted a sliding window counting the number of \(1\)s in the range. Clearly this gave a WA verdict, and that was when I realised I had misread the subtask. I quickly changed my code in an attempt to solve subtask 6, but that still gave a WA verdict because I only calculated 2 columns instead of 3. After half an hour of debugging, I noticed my silly error, and fixed my code once again, but I still got WA after that. 20 minutes before the end of the contest, I started suspecting that my diagonals observation might have some edge cases which I did not have enough time to figure out, so I quickly went back to P3. I kept track of the already used colours to reduce the search space and finally passed the complete graph subtask. I continued debugging my subtask 6 solution but ended up with about 10 WA solutions at the end of the contest. My final score for day 2 was 3 - 37- 31. I knew this was a really bad score as 78 points on P2 was really easy. I was quite worried I would fall out of the bronze medal range, and indeed, I missed the cutoff by less than 4 points.

It’s quite unfortunate that I missed a medal by such a small margin. I’ll have to improve on my speed implementation skills to prevent this from happening again.

### Kwong Weng’s perspective:

Today’s problems are Hieroglyphs, Mosaic and Sphinx. I decide to try the problems in that order, anticipating they have increasing order of difficulty like in Day 1. The problem is fairly short but quite interesting. I got the 3 pts subtasks in \(\le 10\) minutes, but got nowhere 30 minutes in. It has many unrelated subtasks but all of them look impossible.

Realising that it might actually be the most difficult problem of the day, I decide to skip to Mosaic. It is about filling the grid with 0 and 1 using some special rule, then counting the number of 1s in any subgrid. The \(O(n^2)\) solution is immediately apparent, by simply generating the entire grid. Next, I found out that for \(i,j \ge 2\), the value of \((i,j)\) depends on which diagonal it is in (basically the value of \(i-j\)). This observation, along with some prefix sums, would solve this problem completely. The issue though, is with the implementation. There are several edge cases to check - when the subgrid includes the first 2 rows or columns. I debugged my solution for quite some time but it still failed, so I decided to skip to Sphinx first.

Sphinx is an interactive graph problem, I got an \(O(n^2)\) algorithm almost immediately - trying all possible n colours for each vertex. Then I got 50% of the line subtask by checking if neighbouring vertices are of the same colour as well as the whole complete graph problem by binary-searching the answers. Having gotten 47.5 points in roughly 40 minutes, I decided to move back to Mosaic and go for the AC. After hours of debugging, I finally got the AC. (I almost jumped from my seat)

With roughly an hour left, I went back to Hieroglyphs and tried to farm some subtasks, but I couldn’t solve any of them. I end up with 3-100-47.5 for Hieroglyphs, Mosaic, and Sphinx which is slightly lower than yesterday. Feeling that the difficulty is almost the same as yesterday, I feel that I will most likely get bronze. It turns out that Day 2 is much more difficult statistically, so I managed to crawl up to a silver :)

### Chang Jun’s perspective:

On day 2, I approached the contest with the same strategy as day 1, starting by reading through all three problems and their subtasks. I began with the 3-point subtask of question 1, then moved on to question 2, where I earned 37 points using a 2D prefix sum approach. I didn’t have a clear idea for question 3 at first, so I set it aside and focused on the other problems. Question 1 reminded me of the longest common subsequence (LCS) problem, making it seem doable. However, despite realizing that the answer could be either the LCS or \(-1\), I struggled to find an efficient solution after a long time. I had an idea for a subtask where \(N\) and \(M\) were both \(\leq 2000\), but the implementation seemed too lengthy, so I put it on hold and shifted back to question 3, determined to get more points.

For question 3, I managed to complete the first two subtasks using a brute-force method. I believed the rest would require binary search to identify the correct color, and with this approach, I improved my score to 20.5. Still unsure about question 1, I revisited it, hoping for a key observation that would lead to a breakthrough, but I couldn’t make any progress. I then returned to question 2, reviewing the grid, and noticed an interesting diagonal pattern of 1s. After some time, I discovered that these diagonals extend infinitely \(A(i,j) = 1\), then \(A(i+1,j) = 0, A(i,j+1) = 0\), and \(A(i+1,j+1) = 1\). The key was finding the first ‘1’ in each diagonal. I generated a \(50 \times 50\) grid to see any patterns and surprisingly all of the head of the chain started before the first 3 columns or rows, I tested my idea in a checker and it seems correct. Implementing it boosted my score from 37 to 78, a significant leap.

The final subtask for question 2 required some math, which I felt would take too long, so I skipped it and returned to the quadratic solution I had found for question 1. Unfortunately, I ran into numerous bugs and wasn’t able to fully solve the subtask before the contest ended. My final score for day 2 was 101.5. I was nervous about the results since my score was lower than on day 1, but when I met with my team leader afterward, I found out I had earned a bronze medal.

## Day 6: Excursion Day 2 & Closing Ceremony

We took a three-hour bus ride from Alexandria to Cairo, beginning our day with a visit to the Grand Egyptian Museum. Although it was not fully completed, as many artifacts are still housed in the older Egyptian Museum, it was still an interesting experience. We participated in a hieroglyphic writing workshop, where we learned to write our names in ancient Egyptian script. Afterward, we enjoyed a delicious lunch before heading to the pyramids.

While we didn’t receive the extended tour of the pyramids that we had anticipated, we still had a memorable time. We captured some great photos with fellow participants and the Malaysian team, making the most of our visit. The highlight of the day, however, was the closing ceremony dinner, which was held in front of the Sphinx with the majestic pyramids of Giza in the background—a truly breathtaking setting.

After the medal presentation, we took more photos with contestants from Southeast Asia and among ourselves. The ceremony concluded at midnight, and we made our way back to the dormitory, finally arriving at 3 a.m., exhausted but fulfilled after a day of unforgettable experiences.

Pyramids!!

## Day 7: Huawei booth

We were all extremely exhausted after the closing ceremony, all of us woke up at 12-1 pm. Other contestants seem to be the same as the venue seems to be more quiet than usual with only a handful of people in the Huawei Booth. After lunch, we spend our afternoon farming freebies and doing some quizzes, before going back to our room to start packing up our stuff.

## Day 8: Departure

Our bus was scheduled for 8 a.m., so we woke up early to pack our belongings (though one team member, unfortunately, left his AirPods behind in Egypt, likely forever). The ride to the airport took about an hour and a half, during which most of us slept. We arrived at 10 a.m., with 4-5 hours to spare before our flight. To our surprise, the waiting area at the airport was a makeshift tent with inadequate air conditioning under the hot sun. It was certainly a new and memorable experience for us.

After spending some time in the tent, we were finally able to check in and proceed to the boarding gate. Before boarding, most of us picked up some souvenirs. The flight to Doha took about four hours, and upon arrival, we faced an 8-9 hour layover. We decided to find a restaurant with seating, while some of our team members headed to the sleeping area to rest.

By 11 p.m., hunger had set in, so we opted for KFC. Given the high prices at the Qatar airport (around RM 50 for a single meal), we teamed up with the Philippines team to place a bulk order, significantly lowering the cost. We enjoyed 21 pieces of fried chicken while engaging in meaningful conversations with the Philippines team, who shared their national Olympiad problems with us.

Soon after, we boarded our flight back to Kuala Lumpur. After another 8 hours in the air, we were finally able to say, “Home sweet home.”

## Final Thoughts

### Isaac

This was my best performance so far, and I was proud of it. I still feel like I could have gotten a gold medal this year if I had done slightly better, but I was not expecting to get that close to gold. I think that there could be better organisation for this year’s IOI, as most of the tours suggested on the schedule didn’t actually take place, like the Bibliotheca tour after the opening ceremony, or the tour at the pyramids that was supposed to be two hours long, but ended up just being a photography session by the pyramids instead.

I feel that my bad performance at last year’s IOI, had motivated me to train harder in the weeks leading up to this year’s competition and focus on it more, which ultimately led to my silver medal.

### Yan Xun

This was my first IOI, so I was a little worried I would do really poorly due to nervousness. However, once the contest began, I completely blocked everything out except the monitor in front of me, and the contest time felt like it flew by without me realising. The only exception was the last 10 minutes of the contest on Day 2, where I started to worry that I couldn’t debug my P2 solution in time. I was fairly calm originally as I was confident in my solution and didn’t think implementation would be too difficult. Sadly, my worries came true in the end, but I knew that it was ultimately due to my lack of raw skill, so all I had to do was work harder. Despite missing bronze by such a small margin, I was still happy that I could get an AC on the first day. The problems were really interesting and fun to solve.

Meeting so many people from different countries who share a common interest in competitive programming was an eye-opener. Spending time with the Philippines team and Hong Kong team was really enjoyable. The excursions were poorly planned and there was quite a bit of miscommunication, which caused some parts of the excursions to be skipped or cut short, but they were still memorable and pleasant overall.

This year’s IOI was without a doubt a rewarding and novel experience for me. As I have a maximum of three chances left to participate in IOI, I hope to be able to participate in as many IOIs as possible in the future and improve over the years.

### Kwong Weng

This was my best performance so far on both days (my score on both days was 150+, higher than my total score for IOI 2023). I felt so happy to have ACed at least one problem on each day when none of them was trivial – Nile requires 4 segment trees and dealing with odd and even positions, while Mosaic requires some observation and double prefix sum. The interactive (Sphinx) and communication (Messages) are quite cool too, especially Messages which partial scoring allows suboptimal solutions obtain substantial amount of points (I was mind-blown when Jerome told me his 70+ points solution).

Some reflections on my contest experience – I was really nervous as I began the contest, but once I started working on the problems and code the solutions, the anxiety just went off secretly, except for the moments when I was submitting the solutions ofc. The CMS system is really cool too – this year the organisers implemented a script to allow participants to submit solutions through terminal and solutions are judged within a minute (even during peak periods it only takes a few minutes).

In terms of IOI preparation, I didn’t really have much time to prepare as I focused more on IMO previously and was busy ~~playing~~ at NUS. I only started to seriously train for the IOI a week before, during the mind setting camp, and I never touched any OI stuff during IOI so that I wouldn’t get burned out (though I still solved many Jane Street puzzles the night before). This strategy kind of worked as I don’t have too much of the anxiety of knowing too little things which I always had before an examination.

In terms of activities, our team is mostly at the Huawei Booth before the contest. I got several pandas after solving some sudoku puzzles.

### Chang Jun

This was my first IOI and International Olympiad in general, so I was quite nervous. I caught a viral infection and had a sore throat just a few days before the contest. Thankfully, with the help of medicine, I was able to recover in time for the competition. Overall, I’m quite satisfied with my performance, though I missed a few subtasks that were within my grasp. Outside of the contest, I had a lot of fun collecting freebies from various sponsor booths. I managed to snag two pandas from Huawei, a shirt (or two) from Jane Street, a hoodie from Wincent, and some pins from JetBrains. While the excursions and visits could have been a bit more engaging, I still enjoyed the activities—especially seeing the pyramids and the Mediterranean Sea in person, which was truly a memorable experience. In the end, despite the nerves, I thoroughly enjoyed both the contest and the opportunities to explore and interact with other participants. It was a great experience that I will cherish.

We also have a picture with the ASEAN team.