#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

class Poli : public vector<double> {
      public:
       Poli();
       int Gr() const;
       ostream& Print(ostream& os) const;
};

Poli::Poli() : vector<double>()
{ }

ostream& Poli::Print(ostream& os) const
{
    for (int k=0; k<this->size(); k++)
       os << " + " << (*this)[k] << "x**" << k;
    return os;
}

ostream& operator << (ostream& os, const Poli& p)
{
    return p.Print(os);
}


int Poli::Gr() const
{
   int gr= 0;
   for (int k=0; k < (*this).size(); k++)
      if ( (*this)[k] != 0.0 )
          gr= k;
   return gr;
}

Poli operator + (const Poli& p, const Poli& q)
{
   Poli r;
   int Gp= p.Gr();
   int Gq= q.Gr();
   int k= 0;
   while (k<=Gp && k<=Gq)
      {
       r.push_back( p[k] + q[k] );
       k++;
      }
   while (k<=Gp)
      r.push_back( p[k++] );

   while (k<=Gq)
      r.push_back( q[k++] );

    return r;
}


Poli operator - (const Poli& p, const Poli& q)
{
   Poli r;
   int Gp= p.Gr();
   int Gq= q.Gr();
   int k= 0;
   while (k<=Gp && k<=Gq)
      {
       r.push_back( p[k] - q[k] );
       k++;
      }
   while (k<=Gp)
      r.push_back( p[k++] );

   while (k<=Gq)
      r.push_back( -q[k++] );

    return r;
}

int main()
{
   Poli p;
   p.push_back(8);
   p.push_back(3);
   p.push_back(0);
   p.push_back(1);

   Poli q;
   q.push_back(2);
   q.push_back(0);
   q.push_back(4);
   q.push_back(-1);
   q.push_back(5);
   q.push_back(9);

   cout << p << endl;
   cout << "El grado de p= " << p.Gr() << endl;

   cout << q << endl;
   cout << "El grado de q= " << q.Gr() << endl;
 
   Poli r;
   r= p + q;
   cout << "la suma de p y q:\n";
   cout << r << endl;
   cout << "El grado de la suma= " << r.Gr() << endl;
 
   cout << "la diferencia de p y q:\n";
   r= p - q;
   cout << r << endl;
   cout << "El grado de la diferencia= " << r.Gr() << endl;

   return EXIT_SUCCESS;
}








