Output skips name input after second loop or after book

I have no compilation errors or anything and it runs nearly perfectly but for some reason when i go input anything be it a movie or a book after a book is entered or after the second movie in a row is entered then it skips the input for name and only allows me to input price, media type and then rating/author. Below is the code and header files I'm using for this and was hoping if someone could tell me what may be causing this? I have suspicions it could be related to cin.Ignore or getline but after trying to figure this out for hours I've become stumped. Hoping a second pair of eyes may be able to point out some simple mistake I've made.

MAIN

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <string>
#include "Media.h"
#include "Movie.h"
#include "Book.h"
using namespace std;
int main(int argc, char *argv[])
{

// array of 3 media pointers   
Media* arr[3];
Media *m1 , *m2, *m3;
string s;
double p;
string author;
int i, j;
char r;
char sel;
m1 = 0;
m2 = 0;
m3 = 0;
arr[0] = m1;
arr[1] = m2;
arr[2] = m3;

for (i = 0;i<3;i++)
{
    std::cout << "Enter Name" << endl;
    std::getline(cin, s);

    std::cout << "Enter price" << endl;
    cin >> p;
    std::cin.ignore(); // this is used to ignore extra new line caracters from stream because cin does not read new line and it will read by next getLine() and causes the program to not run.
    std::cout << "Is media a book(b) or movie(m): ";
    cin >> sel;
    std::cin.ignore();
    std::cout << endl;

    if (sel == 'm') {
        std::cout << "Enter Rating" << endl;
        cin >> r;
        std::cin.ignore();
        arr[i] = new Movie(s, p, r); // taking user input and creating appropriate object(Movie/Book)
    }
    else
    {
        std::cout << "Enter Author" << endl;
        cin >> author;

        arr[i] = new Book(s, p, author); // taking the user input and creating appropriate object(Movie/Book)


    }
    std::cout << endl;



}
//Sorting
for (i = 0;i<2;i++)
    for (j = i + 1;j<3;j++)
    {

        if (arr[i]->name>arr[j]->name) //calling operator overloading
        {
            Media *temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }


    }


for (i = 0;i<3;i++)
{
    arr[i]->print(); //Dynamic Binding
    std::cout << endl;

}

system("PAUSE");

}

Media.h

#pragma once
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
class Media
{
   public:
        string name;
        double price;
    //operator overloading
    int operator<(Media *b)
    {
        if (name<b->name)
            return 1;
        else
            return 0;

    }
    Media(string s, double d)
    {
        name = s;
        price = d;

    }
//virtual is used for dynamic binding
virtual void print()
{
    cout << "Name is " << name << endl;
    cout << setprecision(2) << fixed << "Price is " << price << endl;
    }

};

Movie.h

#pragma once
#include <cstdlib>
#include <iostream>
#include <string>
#include "Media.h"
using namespace std;
class Movie :public Media
{
public:
    char rating;
    Movie(string s, double d, char r) : Media(s, d)
    {
        rating = r;
    }
    virtual void print()
    {
        cout << "Movie" << endl;
        Media::print();
        cout << "Rating is " << rating << endl;
    }

};

Book.h

#pragma once
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <string>
#include "Media.h"
using namespace std;
class Book :public Media
{
public:
    string author;
    Book(string s, double d, string r) : Media(s, d)
    {
        author = r;
    }
    virtual void print()
    {
        cout << "Book" << endl;
        Media::print();
        cout << "Author is " << author << endl;
    }

};