Rebobinar

Solução escrita por Levi Oliveira

Subtarefa 2, 3. $N <= 1000$, $Q <= 1000$.

Para responder essa subtarefa, podemos simular manualmente cada troca. Ao final, imprimimos o valor na $k$-ésima posição do vetor. Para fazer isso, suponha que estamos na posição $i$ e queremos descobrir qual posição devemos trocar com ela.

Inicialmente, perceba que:

  • $L+0$ troca com $R-0$;
  • $L+1$ troca com $R-1$;
  • $L+2$ troca com $R-2$;

e assim por diante.

Sabemos que $L \leq i \leq R$. Portanto, $i-L \geq 0$. Seja $k=i-L$. Isso implica que $i=L+k$. Como vimos pela relação acima, trocamos a posição $L+k$ com a posição $R-k$. Como $L+k=i$ e $k=i-L$, devemos trocar a posição $i$ com: $$R-(i-L)=R+L-i$$. Assim, podemos percorrer o vetor começando em $L$ e avançando para a direita enquanto a posição atual satisfizer:

$$i \leq R+L-i$$

Tomamos esse cuidado para não trocar uma posição que já foi trocada anteriormente. Por exemplo, se trocamos a posição $4$ com a posição $5$, não podemos trocar a posição $5$ com a posição $4$ novamente.

Complexidade: Para cada operação, podemos percorrer até $N$ posições do vetor. Como temos $Q$ operações, a complexidade total é $O(NQ)$.

Subtarefa 4. $Q = 1$

Para responder a essa tarefa, precisamos estender o raciocínio das subtarefas anteriores.

Perceba que, ao realizar uma operação no intervalo $[L,R]$, trocamos a posição $i$ com a posição $R+L-i$. Portanto, depois que o intervalo recebe a operação, o elemento que estava na posição $i$ passa a ocupar a posição $R+L-i$.

Assim, se $K$ estiver dentro do intervalo da query, isto é, se $L \leq K \leq R$, sabemos que a resposta está na posição:

$$R+L-K$$

Caso contrário, ou seja, se $K<L$ ou $K>R$, a resposta continua sendo $K$, pois essa posição não foi afetada pela operação.

Complexidade: $O(1)$.

Problema completo

Para finalizar esse problema, podemos usar a intuição de descobrir “de onde cada posição veio”. Assim, processamos as queries na ordem inversa para descobrir de onde veio o elemento que está atualmente na posição $K$.

Desse modo, suponha que queremos descobrir a origem da posição atual $cur$ e vamos processar a query $[L,R]$.

Se $cur$ estiver dentro desse intervalo, isto é, se $L \leq cur \leq R$, sabemos que o elemento que está nessa posição veio da posição:

$$R+L-cur$$

Portanto, atualizamos $cur$ para $R+L-cur$.

Caso contrário, ou seja, se $cur<L$ ou $cur>R$, essa operação não alterou a posição do elemento que queremos descobrir. Assim, mantemos $cur$ inalterado.

Ao final de todas as queries, $cur$ indicará a posição original do elemento que terminou na posição $K$.

Código para a resolução do problema