#include <iostream>
#include <vector>

#include <algorithm>
#include <numeric>
using namespace std;

// Function absolute
int absolute (int x) {
return abs(x);
}

// Unary predicate "replace_5"
bool replace_5 (int x) {
return x>5;
}

// Unary predicate "replace_3"
bool replace_3 (int x) {
return x<3;
}

int main ( )

{

// Declaration
vector<int> V1,V2,V3,V4;

// Declaration of the iterator pos

vector<int> :: iterator pos;

// Assignment

V1.push_back(3);

V1.push_back(-2);
V1
.push_back(25);

V1.push_back(-1);

V1.push_back(8);
V1
.push_back(6);

V2.push_back(1);

V2.push_back(2);
V2
.push_back(3);

V2.push_back(4);

V2.push_back(5);
V2
.push_back(6);

V2.push_back(7);

V2.push_back(8);

// Display inner product  of V1 and V2
cout << inner_product(V1.begin( ),V1.end( ),V2.begin( ),0) << endl;

// Display V1
cout << "V1=";
for(pos=V1.begin( );pos!=V1.end( );++pos) {
cout << *pos << " ";
}
cout << endl;

// Sort V1 in the deceasing order
sort(
V1.begin( ),V1.end( ),greater<int>( ) );

// Display V1

cout << "V1=";
for(pos=V1.begin( );pos!=V1.end( );++pos) {
cout << *pos
<< " ";
}
cout << endl;

// Replace the elements of V1 by their absolute values
transform(
V1.begin( ),V1.end( ),V1.begin( ),absolute);

// Display V1

cout << "V1=";
for(pos=V1.begin( );pos!=V1.end( );++pos) {
cout << *pos
<< " ";
}
cout << endl;

// Display V2

cout << "V2=";
for(pos=V2.begin( );pos!=V2.end( );++pos) {
cout << *pos
<< " ";
}
cout << endl;

// Copy V1 at the end of V2
copy(V1
.begin( ),V1.end( ),V2.begin( )+2);

// Display V2

cout << "V2=";
for(pos=V2.begin( );pos!=V2.end( );++pos) {
cout << *pos
<< " ";
}
cout << endl;

// Copy V2 into V3 by inserting
copy(
V2.begin( ),V2.end( ),back_inserter(V3));

// Copy V2 into V4 by inserting in the reverse order
reverse_copy(V2.begin( ),V2.end( ),back_inserter(V4));

// Display V3

cout << "V3=";
for(pos=V3.begin( );pos!=V3.end( );++pos) {
cout << *pos
<< " ";
}
cout << endl;

// Display V4

cout << "V4=";
for(pos=V4.begin( );pos!=V4.end( );++pos) {
cout << *pos
<< " ";
}
cout << endl;

// Replace the values greater than 5 with 5 in V3
replace_if(V3.begin( ),V3.end( ),replace_5,5);

// Copy V3 in V2 replacing the values less than 3 with 3

replace_copy_if(V3.begin( ),V3.end( ),V2.begin( ),replace_3,3);

// Display V1,V2,V3

cout << "V1=";
for(pos=V1.begin( );pos!=V1.end( );++pos) {
cout << *pos
<< " ";
}
cout << endl;

cout << "V2=";
for(pos=V2.begin( );pos!=V2.end( );++pos) {
cout << *pos
<< " ";
}
cout << endl;

cout << "V3=";
for(pos=V3.begin( );pos!=V3.end( );++pos) {
cout << *pos
<< " ";
}
cout << endl;

cout << "V4=";
for(pos=V4.begin( );pos!=V4.end( );++pos) {
cout << *pos
<< " ";
}
cout << endl;

// Display the sum of the elements of V1, V2, V3, V4
cout << "Sum = " << accumulate(V1.begin( ),V1.end( ),0)
+
accumulate(V2.begin( ),V2.end( ),0) + accumulate(V3.begin( ),V3.end( ),0)
+
accumulate(V4.begin( ),V4.end( ),0) << endl;

}