program Conjunto_Intersecao
	implicit none 
    integer  conjA(50), conjB(50), conjI(50), conjU(100),tamA,tamB,tamI,tamU, i, j, k
    logical pertence
    
    !Le os dados de entrada
    write (*, *) "Programa que le dois conjuntos, A e B, e gera os conjuntos Intersecao e Uniao"
    write (*, *)
    write (*, *) "Digite o tamanho do conjunto A e o tamanho do conjunto B"
    read (*, *) tamA, tamB

    write (*, *)
    write (*, *) "Digite os elementos do conjunto A. Varios elementos numa mesma linha"
    read(*,*) (conjA(i), i = 1, tamA, 1)

    write (*, *)
    write (*, *) "Digite os elementos do conjunto B. Varios elementos numa mesma linha"
    read(*,*) (conjB(i), i = 1, tamB, 1)
      
    !Gera o Conjunto de Intersecao
    k = 0
    do i = 1, tamA, 1
      pertence = .false.
      do j = 1, tamB, 1
        if(conjA(i) == conjB(j)) then
          pertence = .true.
        end if
      end do
      if (pertence) then
        k = k + 1
        conjI(k) = conjA(I)
      end if
    end do
    tamI = k
      
    !Gera o conjunto Uniao      
    ! 1a etapa: armazena no conj uniao todos os elementos do conj A 
    do i = 1, tamA, 1
      conjU(i) = conjA(i)
    end do   
    ! 2a etapa: armazena no conj uniao os elementos de B que nao pertencem à A
    k = tamA
    do j = 1, tamB, 1
       pertence = .false.      
       do i = 1, tamA, 1
         if(conjB(j) == conjA(i)) then
           pertence = .true.
         end if
       end do   
       if(.not. pertence) then
         k = k + 1
         conjU(k) = conjB(j)
       end if         
    end do
    tamU = k

    !Imprime os Conjuntos
    write (*, *)
    write (*, *)"Conjunto A:"
    write (*, *)(conjA(i), i = 1, tamA, 1)

    write (*, *)
    write (*, *)"Conjunto B:"
    write (*, *)(conjB(i), i = 1, tamB, 1) 

    write (*, *)
    write (*, *)"Conjunto Intersecao:"
    write (*, *)(conjI(i), i = 1, tamI, 1) 

    write (*, *)
    write (*, *)"Conjunto Uniao:"
    write (*, *)(conjU(i), i = 1, tamU, 1) 
   
    stop
end program Conjunto_Intersecao    