Solução Informática - Nível Intermediário - Semana 28

Solução por Anita Ramos

Esse problema exige que você atualize os valores de uma determinada posição de um vetor toda vez que este for diferente do valor processado anteriormente. Além disso, é necessário armazenar os valores alterados para imprimir no final.

Iniciando a programação então, depois de declarar a biblioteca, declaramos um map e um set que nos ajudaram nesse armazenamento e impressão e declaramos as demais variáveis. Depois lemos o C e o N e já iniciamos o loop para ler todos as atualizações iniciais dadas, guardando em um map v a última atualização para cada número do programa. Em seguida iniciamos o loop de atualizações novas, em que para cada versão lida nós checamos se ela é maior que a versão atual armazenada. Se ela for, nós alteramos a atualização do programa no map para a mais atual e guardamos seu identificador no set s. Por fim, declaramos um iterador para passar por todo o conjunto s e imprimimos o identificador e a última atualização armazenada de cada número do programa, retornando no final a 0.

Segue a programação comentada para melhor compreensão da solução:


#include<bits/stdc++.h> //biblioteca utilizada
using namespace std;
int main()
{
map<long long int, int> v; //declaração do map 'v'
set<long long int> s; //declaração do set 's';
int C,N; //declarção das variáveis
long long int Pc, Vc, Pn, Vn; //declaração de variáveis do tipo long long
scanf("%d %d", &C, &N); //leitura da 1ª linha de entrada
for(int i=0; i<C; i++) //loop para ler todos os 'Pc's e 'Vc's
{
scanf("%lld %lld", &Pc, &Vc); //leitura de um par (Pc,Vc)
v[Pc]=Vc; //no map v, 'v[Pc]' recebe 'Vc'
}
for(int i=0; i<N; i++) //loop para ler todos os 'Pn's e 'Vn's
{
scanf("%lld %lld", &Pn, &Vn); //leitura de um par (Pn,Vn)
if(Vn>v[Pn]) //se o valor 'Vn' lido for maior que o atual armazenado (atualização mais nova)
{
v[Pn]=Vn; //'v[Pn]' recebe 'Vn' (recebe identificador da atualização mais nova)
s.insert(Pn); //insiro 'Pn' no conjunto de impressão 's'
}
}
set<long long int>::iterator it; //declaro um interador 'it'
for (it = s.begin(); it != s.end(); it++) //loop para ir do começo ao fim do meu conjunto de impressão
{
printf("%lld %lld\n", *it, v[*it]); //imprimo o iterador e o valor corresponde a 'v[*it]' no map
}
return 0; //retorna a 0
}