IOI 2025

The 37th International Olympiad in Informatics took place in Sucre, Bolivia between July 27th and August 3rd.

Théo von Düring
News
The 37th International Olympiad in Informatics took place in Sucre, Bolivia between July 27th and August 3rd. 330 participant from 84 different countries competed in the yearly event.
The Swiss team was composed of (from left to right) Jovian Soejono, Andrej Ševera, Linus VandeVondele and Yuhua Su. The team got impressive results with a Silver medal from Andrej, two Bronze medals for Jovian and Yuhua and an Honorable mention for Linus.

Each of the team members described their experience at IOI below

July 22 - 23rd (La Paz journey) – (Jason)

On July 22nd, with excitement in my heart, the journey to IOI was about to begin. Benjamin, Linus, and I met at 5:30 AM at the check-in counter in Zurich Airport. Linus had just escaped from Military Service, and after several rounds of night shifts, he hadn’t had a good sleep for a long time. By the time we reached Bolivia, he probably wouldn’t even need to adjust to the time zone. However, when we got to the check-in counter, an unexpected twist occurred: due to the overbooking, my carry-on luggage had to be checked in. Luckily, there was still some room in the other two’s luggage, so they kindly took in my laptop and drone that couldn’t be carried on. Even though the competition wouldn’t start for another week, we planned to arrive early in La Paz (which is 3650 meters above sea level, even higher than Sucre) to get acclimated to the local environment.

First, we flew to Madrid, where we had some famous tapas (mostly bread with salty ham and bacon) at the airport. After more than 10 hours of flying, we finally landed in South America. But did you think it was over? Of course not. We first landed in Lima, Peru, and then faced a 7-hour layover, during which we played trio, wrote some code, wandered around aimlessly, and even tried the popular local dish, ‘pollo’ (grilled chicken). Finally, after a total of 24 hours of travel time, we arrived in La Paz. The IOI team was there to pick us up.

Plane flying over Bolivia

The altitude of La Paz’s airport is over 4000 meters, while Lima, being a coastal city, is at sea level. I was a little concerned about altitude sickness, but surprisingly, all three of us felt fine. It was early morning when we arrived, but honestly, I had already lost track of the date. La Paz is built on a small basin on the plateau, and the airport is located on the edge of the basin, offering a panoramic view of the city. On the way from the airport to the hotel, we had a chance to admire the night view of the city – countless incandescent lights sparkling like stars. After arriving at the hotel, we rested for a while and then began our journey at IOI.

July 24th (La Paz) – (Linus)

After a good night’s rest, we enjoyed a pleasant breakfast at the hotel. Later in the morning, we tackled a past IOI competition – specifically, Day 2 from 2023. Jason had a solid theoretical approach to one of the tasks, but the implementation proved challenging. It turned out to be a valuable and productive training session.

In the early afternoon, we had a late lunch at a restaurant near the spot we visited yesterday at noon. Afterward, we explored La Paz, taking a scenic round trip on the cable car. The panoramic views of the city were stunning, and the entire ride lasted nearly two hours. Since the sun sets early here, we were fortunate to catch the sunset while still on the cable car – an unforgettable experience.

img1 img2

Later, Jason briefly went out to fly his drone.

img3 img4

July 25th (La Paz) – (Jason)

On July 25th, it seemed like just another ordinary day.

For breakfast, we had bread, fried eggs, coca tea (I always thought it just had caffeine, but it turns out it also contains cocaine), and tropical fruits like watermelon, papaya, and bananas. It was quite nice.

Benjamin mentioned not feeling well, but we thought it was just regular altitude sickness, so we started working on some problems. One problem we tackled was a guessing game where Alice and Bob are each given different pieces of information about two numbers, mm and nn, with a known lower bound ss for mm (i.e., smns \leq m \leq n). The goal is for both to figure out mm and nn after a series of back-and-forth questions, each of them answering “I don’t know” multiple times before they can both figure it out. Alice knows the product mnm \cdot n, while Bob knows the sum m+nm + n. Through a sequence of “I don’t know” answers, they both eventually deduce the numbers. I was shocked that the numbers could be figured out just by alternating “I know” and “I don’t know” responses. In the end, I solved it using dynamic programming – it was a very clever solution.

We also had lunch at a Japanese restaurant, where I had a big bowl of ramen. The restaurant was filled with anime posters and figurines, giving it a cozy, lively vibe.

Interior of a Japanese restaurant

Later that afternoon, while debugging past IOI problems, we received bad news: Benjamin had been sent to the hospital with pneumonia and might stay there for a few days. The worst part was his luggage was still at the hotel. So I went to grab his room key, but couldn’t get a ride due to the rush hour, so I walked back to the hotel and then took the luggage to the hospital with Linus. We hope Benjamin gets better and joins us at IOI.

For dinner, we went to an Argentine restaurant near the hospital. The steak I had there was the best I’ve ever tasted. Linus wasn’t feeling well, so he didn’t eat much, likely because of the bumpy taxi ride. Back at the hotel, I finished debugging the code and then went to bed.

July 26th (La Paz) – (Linus)

After a long night of debugging, we ended up sleeping in and skipping breakfast, heading straight into an early lunch instead. Later in the day, we tackled a training contest – I worked on an old IOI 2023 Day 1 problem set, while Jason focused on some output-only tasks. In the evening, we had dinner at a lovely restaurant. The food was fantastic – Jason had llama, which turned out to be excellent, along with a milkshake.

Dish with llama meat

On our walk back to the hotel, we passed through a lively street festival.

July 24 - 25th (Sucre journey) – (Andrej)

As Benjamin had already left with Jason and Linus to La Paz, the rest of the Geneva gang (Théo, Jovian and I) met at Geneva Airport at the very reasonable time of 5 AM, throwing all of our sleep schedules into even more of a desperate state (this is definitely going to get better with jetlag). So, we were going to Sucre, the Constitutional Capital of Bolivia. Can’t be that hard, right… ?

First we waited 2 hours in Geneva, complaining a bit about the length of the queues (little did we know…). After an uneventful flight to Madrid, began the great saga of Transfering at Adolfo Suárez International Airport. We had 4.5 hours, that should be way more than enough, right? Right?

  • wait 30 minutes at luggage pickup because of course we need to check it in again,
  • wait 45 minutes in the queue for check-in,
  • take 60 minutes to check-in because the staff doesn’t understand the concept of a 2-flight booking so they have to alert half the airport to get our luggage checked in,
  • take 30 minutes to go through security, because of course there is no way to empty your water bottle after having gone through the queue and you have to go back to the bathroom,
  • take 20 minutes to get to the terminal (you obviously have to take a train to go there),
  • wait 45 minutes at passport control since Jovian doesn’t have a Schengen passport and the queue is way too long,

and that’s 3h50 of our lifetimes wasted. Great.

With all that the trans-atlantic flight to Lima turned out to be the least eventful part of our trip.

But hold on a minute 20 hours, we aren’t done yet! Now we got to wait 7 hours in Lima (at least we didn’t have to check in again), eating some ramen (oh how much would I crave for this ramen during the rest of IOI), and trying to sleep more or less successfully. Then we took a 2.5 hour flight to Santa Cruz de la Sierra, after which we waited another 4 hours there while the sun was raising (you might think that means 24 hours passed since the start of our trip, but you forgot to account for timezones so it’s actually 32), before taking a tiny plane with 20 seats to finally get to Sucre (that flight felt more sickening than a bus ride).

And now we can rest, right? Well, no, because it’s 9 AM and we can only check in to our hotel at noon… so we walk a bit around the city, get the cheapest lunch I’ve ever had (8 francs for 3 people), find one of the only supermarkets in the city to buy 2L of sparkling water by accident, and then we can finally get our rooms. Hurray!

Did I mention something about sleep schedules? We were all feeling very tired so we decided to take a nap and wake up at 5 to get dinner. Well that was the plan. In reality no one heard their alarm and we all slept until the next morning.

July 27 (IOI Arrival Day) – (Andrej)

After a great breakfast at the hotel (again, biscuits and papaya), it was time for the official part of IOI to start. Well, not before taking a transfer bus to the participant accomodation (the Villa Bolivariana) and having Théo do the registration. Now since Sucre is such a large city, they definitely have accomodation for 350 people… as long as you put 8 people per room (now there were clearly enough rooms to have half as many people per room, so I guess it was a pitiful attempt at forcing us to socialise).

In the morning, Jovian watched the Formula 1 race while I was throwing a Codeforces round. Eventually it was time for lunch, which was surprisingly edible (by OI standards). After this we socialised with the Austrian team and played some card games, before we went back to do whatever in our room. At some points our roommates, the South Korean team, arrived, and as they were very extroverted people they didn’t even respond when we tried to say hi. Surely we can try to socialise with them later.

At some point we ate dinner, then we continued doing whatever in the room until we went to sleep pretty early since our sleep schedules were still somewhat messed up. That was a very eventful day. This may or may not become a recurring trend during this IOI.

July 28th (Opening ceremony) – (Jovian)

So, the first “real” day of IOI was today. This day is usually quite eventful, with a crucial practice session in the morning to test out the contest environment and a grandiose opening ceremony in the afternoon; this year was no different.

We first got up at 7:30am to experience one of the breakfasts of all time: some toast, scrambled eggs, a few slices of papaya and some granola cereal. To be honest, it was actually pretty decent, but I felt that papaya after Sunday’s race was quite cruel (iykyk).

After that, it was time to transfer to the contest hall – a large, modern building seemingly originally designed for the Bolivarian Youth Olympics. This is the perfect time for me to introduce what would likely become a recurring motif, as Andrej and I remarked: the Bolivian Ministry of Health and Sports, aka the Ministry of Salute and Deportation [1]. This ministry was behind much of the IOI. Anyway, the building was quite nice and modern, and we got a preview of the sponsor hubs that were to come, such as the OpenAI Fun Zone and others run by Wincent, Huawei and the like. We joined the long line of teams to enter the contest hall, which ended up taking an hour. Thankfully, the schedule had actually planned for it to take an hour to enter the contest hall, so we were not in fact behind schedule.

The practice contest began at 10am, and as is often the case at IOI, actually had reasonably interesting problems; my favorite one was a twist on the classic binary search guessing game where the interactor starts lying at a point in time that is not known to the program. The workstation setup was also highly unusual with both sides of each table being used for participants in an alternating fashion, and if one were to accidentally hit something, chances were that the monitor would fall to the floor. We also spent some time testing out the grader and the machine.

Once the practice contest was over we went to have lunch back at the Villa Bolivariana, after which, at 2:30PM it was time to head for the opening ceremony. Not actually held at the Villa Bolivariana, it was to be held at some kind of library in the city center, which necessitated a bus transfer.

It was now that we got to witness insane organization as we entered the bus promptly at 2:30PM only to sit and wait for a bit of time, to say the very least. By the time we got to the venue it was 3:30PM, a half hour after the ceremony was meant to start. Alas, that was not the end, as we waited in our seats until 4:30PM when the ceremony actually started.

Now began the clear highlight of the day, one of the ceremonies of all time. It started off well enough, with a series of captivating traditional Bolivian dance performances. Soon, though, as we all know, came the usual shenanigans, the highlights of which were:

  1. this is the gathering of the brightest young minds, who will tackle the challenges of tomorrow and lead the next generation of computer scientists.
  2. we will run a highly exciting (sure?) AI IOI contest in parallel to the actual IOI contest.
  3. welcome to IOI 2025, the 37th edition of the contest in Sucre, the constitutional capital of Bolivia! (repeated only 12 times)

In a highly interesting and unexpected plot twist, they also went through the list of delegations twice, once in the usual manner with the onscreen slideshow and again at the end for some reason (maybe the buses hadn’t arrived yet). Of course, on Switzerland’s turn, we threw chocolate into the crowd (yes, twice). Just as last year, there were some interesting political moments.

The president of Bolivia also made an appearance. From these events, it was thus clear that this was truly to be one of the IOIs of all time.

[1]Spanish name quotes “Salud” (which means health) and “Deportivo” (which means sports).

July 29th – ()

SOON…

July 30th (Contest Day 1) – (Andrej)

Finally it was time for the main event of the week! Thankfully breakfast today at least had some decent cereals, unlike yesterday, so I tried to get as much nutrition as I could out of them (at least it’s somewhat better than overly dry bread).

Then it was time to walk to the contest hall, and wonder how it took so long for people to enter (there were 90 minutes assigned on the schedule just for that). After waiting in the queue for way too long, we saw that everyone was getting scanned with metal detectors before being allowed to enter the hall. When we finally did enter, a tragedy happened as Jovian’s submitted snacks hadn’t been delivered to his desk. Even more evidence of the organisational prowess that IOI 2025 kept delivering.

As for the contest itself, two of the tasks were quite nice, but the second one was completely disgusting (what would IOI be without at least one disgusting problem?). I did really well on day 1, ending up 14 points above gold cutoff, and achieving my goal of being in the top 4 of the people in our room. Jovian and Jason unfortunately were both 10-20 points below silver cutoffs, hopefully they will be able to catch up tomorrow. Linus wasn’t in the top 50% on day 1, but he wasn’t that far off so bronze could still happen.

After the contest we got lunch and then had a lot of free time to look around the sponsor hubs at the contest venue. We got some merch and free snacks, but overall there really wasn’t a lot to do, so we just spent a few hours sitting around until István from the Hungarian team taught us and a Czech participant a stupidly complicated Hungarian card game (we played for 2 hours, and only at the very end we played with all the rules).

Eventually we had to go back for dinner, and after that we… did whatever in our rooms until we went to sleep (you might notice a recurring pattern here).

July 31st (Excursion) – (Linus)

A picture of the Castillo de la Glorieta

Today we visited the Castillo de la Glorieta, a castle located about 30 minutes south of Sucre. Jason wasn’t feeling well, so only Andrej, Jovian, and I went.

The guided tour lasted about an hour. The castle itself was fairly simple to walk through, with a few towers and decorated rooms. While it was nice to see, the visit was not particularly long or detailed, so we moved on rather quickly.

After the tour, the organizers had planned a fellowship or integration day with different activities. The first part included some PE-style sports. I was the only one from our group who participated, while Andrej and Jovian spent the time solving Codeforces problems.

Later we played a capture the flag game. Each player had two “lives,” shown by ribbons tied to us. If an opponent managed to pull both ribbons, you were out. The game was energetic and fun, though a bit tiring in the sun.

In the afternoon, once we were back in our room, we each did our own thing – mostly resting or preparing quietly for the upcoming competition.

A memorable line from the day came from Andrej, who joked:

This day was in the top 10 of the official IOI organized days.

(Context: He meant it ironically, since we had been discussing how it was actually one of the less exciting days.)

August 1st (Contest Day 2) – (Jovian)

“The main takeaway is: fuck 40017.” ~ Andrej

This is the end; hold your breath and count to ten. Today marked the final contest of our 2025 informatics season, the deciding factor in our IOI results. Quite a lot was at stake - Andrej needed to close out his strong day 1 to clinch Switzerland’s first gold medal since ‘21; I needed to somehow clutch up a silver medal so as not to lose my aura (given my performance last year); Jason had similar chances at a silver; and Linus was faced with the task of pushing himself into medal range. Note also that it’s 734th Swiss National Day :))

We got up at 7:30 delighted to find that they had kept the good breakfast going, and proceeded to the contest hall where the entrance process was actually considerably smoother than on day 1. Upon reaching our workstations, we were reunited with our snacks (yayyy Oreos), and more importantly Rösti was not, in fact, lost.

Anyway, time for the contest. The problems were of a less ad-hoc nature than day 1 and I enjoyed them quite a lot. I totally did not get scammed once again by missing 13 points for a trivial bug. By the end of the contest, the day 2 scores of me, Andrej and Linus were quite tightly locked up, and Luca came again to show us the scoreboard. Results were as follows:

  • Andrej sadly fell to the high silver range due to a suboptimal day 2 performance, importantly missing out on 35 points which he had been trying to debug for quite a while (a minor bug, he conjectured);
  • I ended with a high bronze performance that could have been silver if I had implemented better (25 points below cutoff, with 27 points missing due to slip ups). Aura loss, but I guess it happens;
  • Jason had a suboptimal day 2 but clutched a low bronze medal;
  • Despite a subpar day 1, Linus fought back today all the way to the very middle of the scoreboard! However, it was uncertain whether Linus had medaled as he was very close to the median score with 250.35 points. Surely the jury should consider taking a “nice round cutoff” of 250, rightttt?

We went to have lunch, then Andrej and I headed back into the contest hall for the analysis session, desperate to understand why we had not gotten our deserved points. At my desk, I quickly found that I had written a >= inequality where a > was called for - classic informatics crashout. But Andrej’s bug was far more difficult to figure out. It was a bizarre issue on a run-twice problem (where a program is run two separate times, usually to first encode some information and then use a fixed strategy to decode that information later). Somehow, the program gave the right answer when run locally with the given sample grader, but gave a wrong answer on the official grader. He had proofread his code a (large number) of times but there were no issues apparent..

For analysis, the official grader could be run locally, but it was so esoteric and undecipherable that Andrej had to call over a member of the technical committee to help him run his code; he proceeded to spend 30 minutes writing out cryptic commands (you had to run three different commands at once) and talking about some system with FIFOs (don’t ask me what that means). Eventually, he figured out a way to run the code, and it indeed gave the wrong answer. So now the fun part began, which was debugging the actual code . Now I present what might be the most legendary bug ever. So the run-twice detail I mentioned above turned out to be crucial, as the sample grader did not, in fact, run the code two separate times, allowing global variables to persist between the two steps. In particular, the value of some important variable was not given on the second step, so it had to be inferred from the input. Andrej realized this necessity and accordingly initialized it in the second step.

However, he did so too late, as its value is involved in indexing an array two lines prior. Without the existence of this variable, the code would not compile EXCEPT that it had been declared as a global variable for the purpose of the first step, so instead of not existing, prior to its initialization, it simply had a garbage value. Now this should in theory completely mess up the logic in the second step, but now comes a cruel twist of fate: its garbage value was actually very close to what it was supposed to be. That is to say, a difference of 10002 vs. 10000. So enough of the logic would work fine, except that there would be an extra meaningless value indexed from the array from a memory location outside the array bounds. In this case, an irrelevant number 40017 was found to be present, when the program only expected numbers between 0 and 5, hence completely messing up the logic of the program.

Andrej moved the initialization of the variable up by three lines and it immediately scored the 35 points. A truly legendary, once-in-a-lifetime bug, with all circumstances lining up to produce such an artwork. Clearly, this could only be the divine forces, intervening to ensure that Andrej would earn yet another silver medal to add to his vast collection (80% of his medals are silvers, probably more to be honest). In fairness he still would have missed gold by 7 points, but there was also algebra (I am not elaborating on this).

Anyway, after witnessing such a cataclysmic piece of art, we went to depress in the lobby of the Villa Bolivariana, but soon decided we might as well go watch the talent show. What better things are there to do anyway? Be social? Who even does that.

The talent show started an hour late (because of course it did) and featured various fun acts performed by the IOI contestants. Highlights:

A series of traditional songs from across Bolivia

An extremely energetic rendition of uncannily stereotypical Balkan rap

I am a parallelogram (most fire song to exist)

On the 12th day of codemas, my computer gave to me 12 compiler warnings, 11 compiler warnings 10 compiler warnings 9 compiler warnings 8 compiler warnings 7 compiler warnings 6 compiler warnings 5 COMPILER WARNINGS 4 compiler warnings 3 compiler warnings 2 compiler warnings and a syntax error on line three! A peak example of comedy by repetition

An impassioned performance of “Without Me” by Eminem marred by severe technical issues with the microphone for most of the song, seemingly only working when a swear word was being sung

Russian cactus instrument playing to the backdrop of dancing McDonald’s happy meals (you read that right)

After all the shenanigans of the IOI thus far, it was a great demonstration of culture from around the world and the singing talent of the contestants that lifted us out of our collective depression (even if during the show, the jury voted on a bronze cutoff that left Linus three ranks below it with an HM ://). But all good things must come to an end, as they played the IOI song (woahh woahhhh). By then it was 10PM, so we had dinner and then hurried off to our rooms to look at scuffed Python scripts and eventually sleep.

August 2nd – ()

SOON…

August 3-5th – (Jovian)

The journey back…

After spending this much time in Bolivia, it was finally time to head back. We had parted ways with Linus, Jason and Benjamin so it was time for the “Trio of Collective Suffering in Airports” to retrace those torturous steps we had made way back on the 24th, in what felt like another life. Thankfully, though, this time we only had to make 2 layovers instead of 3, courtesy of a direct flight from Santa Cruz to Madrid, bypassing the need for that painful 7-hour layover in Lima.

But before that, we had a day to kill in Sucre. Because of course we did.. We returned to that hostel (Recoleta) that had paid us faithful sleep service all those days ago, and had a good night’s sleep before waking up on the 4th for our final few hours in Sucre. We were really, genuinely, wholeheartedly out of ideas as to what we could possibly do in the city, so we decided to go to the Parque Simon Bolivar and just vibe for a while. We talked about random stuff and then went for lunch at a “Fast Seafood” restaurant, which gave us a chance to meet our guide for the very last time so that was nice at least. After saying our final goodbyes it was then time to make a quick stop at the hostel to retrieve our suitcases, and now began the ultimate, final journey, which began with Bolivian IOI organization making its final hurrah by failing to book enough buses to the airport. Would this error end up costing us the way back? Thankfully two extra buses that they presumably chartered on the spot arrived soon after to take me, Andrej and Théo to the airport.

We arrived at the airport way clear of our departure time, and were lucky enough to be first in line to check in our luggage at the counter. After this there was predictably nothing to do in the airport (were you expecting a plot twist of excitement to arrive) but the one notable thing that happened was I got my name called on an airport speaker for the first time in my life. Did someone hide drugs in my suitcase? No, it was just the dog barking at the wrong moment, it seems, as I confirmed to the officers that nothing was suspect in my suitcase. I did get to see the backrooms of the airport - new experiences never hurt, I suppose. Soon after, they opened security: indeed, at this airport, you can only go through security if your flight departs within an hour, and because there are obviously a lot of outbound flights from this airport, there are huge windows of time when you’re not allowed to go through security.

We proceeded to board our first flight to Santa Cruz, which we were delighted to find was in an Airbus A320 and not a tiny Bombardier, which made the 45-minute flight experience race by as if it were nothing. Upon arrival, we went through immigration and proceeded to the Santa Cruz airport terminal, this time on the international side. We were elated to discover that there was an abundance of things to do.

Aha! Did you really think I was being serious there? No, not even the most important international airport in Bolivia boasted an extravagant terminal. There were maybe three small restaurants - I mean cafés; and 4 gates. Don’t forget that the entire terminal was just one room slightly larger than the IOI contest hall and there was essentially non-existent seating at the gates. Accordingly, we visited one of the cafés to get some food and met a few other IOI delegations such as the Irish and Austrian teams. The layover went by fairly fast in light of all this and it was soon time for boarding.

The highlight of our day was now about to happen: as rumors had been spreading in the IOI community, the airport officers told us to place our bags in a long row and line up in front of them, then they brought in a bunch of dogs to sniff the bags! Nobody’s bag was soiled in the process, but it was still a funny occurrence. We then boarded the plane to Madrid which was an 11-hour flight organized by Boliviana de Aviacion. It was actually a surprisingly good flight on par with other long-hauls I’ve taken, with everything you would expect in a long-haul flight. And indeed, from here on, everything was fairly uneventful as we touched down in Madrid, checked in to our final Iberia flight, got some more food, took the flight which was less than 2 hours long, and landed in Geneva at 10:30PM CEST on the 5th, concluding a journey that had only taken 24 hours instead of 32 and an IOI experience that had lasted 13 (!) days in total. We parted ways for the last time, and so concludes another year of informatics.