printРешение

Тема: дерево максимумов, сортировка или списки
Сложность: высокая

Сначала нужно отсортировать начала и концы отрезков, соответствующей попытке гнома покрасить забор. В C/C++ можно использовать стандартную функцию qsort/sort, в Pascal нужно либо написать эту функцию самостоятельно, либо реализовать более простой алгоритм сортировки расстановкой. Значения с одинаковым ключом храним в виде списков.
var 
  sl:array [1..100001] of integer; 
  tries:array [1..100000] of record
    color:char; 
    i,j:integer;
    nexti,nextj:integer;
  end;
  N,M,i,j,k,p:integer;
...
readln(N,M);
for i:=1 to M do
begin
  readln(tries[i].color,tries[i].i,tries[i].j);
  tries[i].nexti:=sl[tries[i].i];
  sl[tries[i].i]:=i;
  tries[i].nextj:=sl[tries[i].j+1];
  sl[tries[i].j+1]:=i;
end; 
Далее используем дерево максимумов, в котором в ячейке `i` хранится максимальное из чисел в ячейках `2*i` и `2*i+1`. Неиспользуемые ячейки дерева помечаются значением 0. Листья дерева располагаются все на одном уровне и начинаются с ячейки 131072 (`=2^17`, первая степень двойки большая `10^5`). При обработке начала `k`-й попытки гнома покрасить забор, значение `k` в помещается ячейку (131071+`k`), при обработке конца попытки – в эту ячейку помещается 0.
var maxtree:array[1..262144] of integer;
...
for i:=1 to N do
begin
  j:=sl[i];
  while j<>0 do
  begin
    k:=j+131071;
    if tries[j].i=i then
      maxtree[k]:=j
    else      
      maxtree[k]:=0;
    while k>1 do
    begin
      p:=k div 2;
      if maxtree[2*p]>maxtree[2*p+1] then
        maxtree[p]:=maxtree[2*p]
      else
        maxtree[p]:=maxtree[2*p+1];
      k:=p;
    end;
    if tries[j].i=i then
      j:=tries[j].nexti
    else
      j:=tries[j].nextj;
  end;
  if maxtree[1]=0 then
    write('.')
  else
    write(tries[maxtree[1]].color);
end;
writeln;
В C++ вместо дерева максимумов можно использовать стандартный класс set.
loading