Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #include<vector>
- #include<time.h>
- //#include "bitmap_image.hpp"
- #define pi (2*acos(0.0))
- using namespace std;
- class node;
- class node
- {
- public:
- string val;
- node* left_child;
- node* right_child;
- vector <int > h;
- vector <int > w;
- };
- vector <int > temp;
- vector <node> tree;
- vector <int > temp2;
- vector <node> tree2;
- int area()
- {
- int pos=0;
- for(int i=0;i<temp2.size();i++)
- {
- pos=temp2[i];
- //cout<<temp2[i]<<"hau";
- if(tree[pos].left_child==NULL)
- {
- if(tree[pos].right_child==NULL)
- {
- //cout<<pos<<"\n";
- continue;
- }
- }
- else if(tree[pos].left_child!=NULL)
- {
- if(tree[pos].right_child!=NULL)
- {
- cout<<tree[pos].val<<"\n";
- //cout<<pos<<"\n";
- /* int pos1,pos2;
- for(int j=0;j<tree.size();j++)
- {
- if(tree[j].val==tree[pos].left_child->val)
- {
- pos1=j;
- }
- }
- for(int j=0;j<tree.size();j++)
- {
- if(tree[j].val==tree[pos].right_child->val)
- {
- pos2=j;
- cout<<pos1<<" "<<pos2<<"\n";
- }
- }
- */
- if(tree[pos].val=="H")
- {
- for(int x=0;x<tree[pos].left_child->h.size();x++)
- {
- for(int y=0;y<tree[pos].right_child->h.size();y++)
- {
- tree[pos].h.push_back(tree[pos].left_child->h[x]+tree[pos].right_child->h[y]);
- }
- }
- for(int x=0;x<tree[pos].left_child->w.size();x++)
- {
- for(int y=0;y<tree[pos].right_child->w.size();y++)
- {
- if(tree[pos].left_child->w[x]>=tree[pos].right_child->w[y])
- {
- tree[pos].w.push_back(tree[pos].left_child->w[x]);
- }
- else
- {
- tree[pos].w.push_back(tree[pos].right_child->w[y]);
- }
- }
- }
- cout<<"FOR H: \n";
- for(int i=0;i<tree[pos].h.size();i++)
- {
- cout<<tree[pos].h[i]<<" "<<tree[pos].w[i]<<"\n";
- }
- cout<<"\n\n\n\n\n\n\n";
- //cout<<pos<<" "<<pos1<<" "<<pos2<<"\n";
- }
- else if(tree[pos].val=="V")
- {
- cout<<"dhuksi\n";
- cout<<tree[pos].left_child->val<<" "<<tree[pos].left_child->h.size()<<"\n";
- cout<<"tree2:\n";
- for(int i=0;i<tree.size();i++)
- {
- cout<<tree[i].val<<"\n";
- if(tree[i].left_child!=NULL)
- {
- cout<<tree[i].left_child->val<<" "<<tree[i].right_child->val<<"\n";
- /* for(int j=0;j<tree[i].left_child->h.size();j++)
- {
- cout<<tree[i].left_child->h[j]<<" "<<tree[i].w[j]<<"\n";
- }
- for(int j=0;j<tree[i].right_child->h.size();j++)
- {
- cout<<tree[i].right_child->h[j]<<" "<<tree[i].w[j]<<"\n";
- }
- */
- }
- for(int j=0;j<tree[i].h.size();j++)
- {
- cout<<tree[i].h[j]<<" "<<tree[i].w[j]<<"\n";
- }
- }
- for(int x=0;x<tree[pos].left_child->w.size();x++)
- {
- for(int y=0;y<tree[pos].right_child->w.size();y++)
- {
- cout<<tree[pos].left_child->w[x]+tree[pos].right_child->w[y]<<"\n";
- tree[pos].w.push_back(tree[pos].left_child->w[x]+tree[pos].right_child->w[y]);
- }
- }
- for(int x=0;x<tree[pos].left_child->h.size();x++)
- {
- for(int y=0;y<tree[pos].right_child->h.size();y++)
- {
- if(tree[pos].left_child->h[x]>=tree[pos].right_child->h[y])
- {
- tree[pos].h.push_back(tree[pos].left_child->h[x]);
- cout<<tree[pos].left_child->h[x]<<"\n";
- }
- else
- {
- tree[pos].h.push_back(tree[pos].right_child->h[y]);
- cout<<tree[pos].left_child->h[x]<<"\n";
- }
- }
- }
- //cout<<pos<<" " <<pos1<<" "<<pos2<<"\n";
- for(int i=0;i<tree[pos].h.size();i++)
- {
- cout<<"FOR V: \n";
- cout<<tree[pos].h[i]<<" "<<tree[pos].w[i]<<"\n";
- }
- cout<<"\n\n\n\n\n\n\n";
- }
- /*for(int i=0;i<tree[pos].h.size();i++)
- {
- cout<<tree[pos].h[i]<<" "<<tree[pos].w[i]<<"\n";
- }
- cout<<"\n\n\n\n\n\n\n";
- */
- //cout<<tree[pos].w.size()<<"\n";
- int choice[tree[pos].h.size()];
- for(int t=0;t<tree[pos].h.size();t++)
- {
- choice[t]=1;
- }
- for(int k=0;k<tree[pos].h.size()-1;k++)
- {
- for(int b=k+1;b<tree[pos].h.size();b++)
- {
- if(choice[b]!=0 && choice[k]!=0)
- {
- if(tree[pos].h[k]<=tree[pos].h[b] && tree[pos].w[k]<=tree[pos].w[b])
- {
- choice[b]=0;
- //tree[pos].h.erase (tree[pos].h.begin()+b);
- //tree[pos].w.erase (tree[pos].w.begin()+b);
- }
- else if(tree[pos].h[k]>=tree[pos].h[b] && tree[pos].w[k]>=tree[pos].w[b])
- {
- //cout<<k<<" ssss "<<b<<"\n";
- choice[k]=0;
- //tree[pos].h.erase (tree[pos].h.begin()+b);
- //tree[pos].w.erase (tree[pos].w.begin()+b);
- }
- }
- }
- }
- /*for(int t=0;t<tree[pos].h.size();t++)
- {
- cout<<choice[t]<<" ";
- }
- cout<<"\n";
- */
- vector<int> hold1;
- vector<int> hold2;
- for(int t=0;t<tree[pos].h.size();t++)
- {
- if(choice[t]==1)
- {
- hold1.push_back(tree[pos].h[t]);
- hold2.push_back(tree[pos].w[t]);
- }
- }
- tree[pos].h.clear();
- tree[pos].w.clear();
- tree[pos].h=hold1;
- tree[pos].w=hold2;
- cout<<tree[pos].w.size()<<" \n";
- /* for(int i=0;i<tree[pos].h.size();i++)
- {
- cout<<tree[pos].w[i]<<" "<<tree[pos].h[i]<<"\n";
- }
- cout<<"\n\n\n\n\n\n\n";
- */
- cout<<"tree:\n";
- for(int i=0;i<tree.size();i++)
- {
- cout<<tree[i].val<<"\n";
- if(tree[i].left_child!=NULL)
- {
- cout<<tree[i].left_child->val<<" "<<tree[i].right_child->val<<"\n";
- }
- for(int j=0;j<tree[i].h.size();j++)
- {
- cout<<tree[i].h[j]<<" "<<tree[i].w[j]<<"\n";
- }
- }
- }
- }
- }
- pos=temp2[temp2.size()-1];
- // cout<<pos<<"\n";
- int area[tree[pos].h.size()];
- int barea=0;
- int hold3=0;
- for(int c=0;c<tree[pos].h.size();c++)
- {
- if(tree[pos].h[c]*tree[pos].w[c]>barea)
- {
- barea=tree[pos].h[c]*tree[pos].w[c];
- hold3=c;
- // cout<<barea<<"\n";
- }
- }
- //cout<<barea;
- return barea;
- }
- void postorder(int m,int sz)
- {
- //cout<<m<<" "<<tree[m].val<<" "<<tree[m].left_child<<" "<<tree[m].right_child<<"\n";
- if(tree[m].left_child!= NULL)
- {
- postorder(2*m+1,sz);
- }
- if(tree[m].right_child!=NULL)
- {
- postorder(2*m+2,sz);
- }
- else
- {
- temp.push_back(m);
- // cout<<tree[m].val<<"\n";
- return ;
- }
- temp.push_back(m);
- //cout<<tree[m].val<<"\n";
- return ;
- }
- void postorder2(int m,int sz)
- {
- //cout<<m<<" "<<tree[m].val<<" "<<tree[m].left_child<<" "<<tree[m].right_child<<"\n";
- if(tree[m].left_child!=NULL)
- {
- postorder2(2*m+1,sz);
- }
- if(tree[m].right_child!=NULL)
- {
- postorder2(2*m+2,sz);
- }
- else
- {
- temp2.push_back(m);
- // cout<<tree[m].val<<"\n";
- return ;
- }
- temp2.push_back(m);
- //cout<<tree[m].val<<"\n";
- return ;
- }
- void algorithm()
- {
- int To,r,efsilon;
- //cin>>Eo;
- for(int i=0;i<tree.size();i++)
- {
- node tama;
- //tree2[i].h.clear();
- tama.h=tree[i].h;
- //cout<<"tama";
- tama.left_child=tree[i].left_child;
- tama.right_child=tree[i].right_child;
- tama.val=tree[i].val;
- //tree2[i].w.clear();
- tama.w=tree[i].w;
- tree2.push_back(tama);
- }
- //cout<<tree2.size()<<"\n ";
- for(int i=0;i<tree2.size();i++)
- {
- //cout<<tree2[i].val<<" "<<tree2[i].left_child<<" "<<tree2[i].right_child<<"\n";
- for(int j=0;j<tree2[i].h.size();j++)
- {
- //cout<<tree2[i].h[j]<<" "<<tree2[i].w[j]<<"\n";
- }
- }
- temp2.clear();
- postorder2(0,tree.size());
- To=1;
- r=2;
- efsilon=1.5;
- // cin>>To;
- //cin>>r;
- //cin>>efsilon;
- vector <int> Ebest;
- vector <int> Eo;
- Eo=temp2;
- int T=To;
- Ebest=temp2;
- for(int b=0;b<temp2.size();b++)
- {
- // cout<<Eo[b]<<" "<<Ebest[b]<<"\n";
- }
- int oldarea=area();
- int bestcost=oldarea;
- cout<<oldarea<<" "<<bestcost<<"\n";
- vector<node> tree4;
- vector<int > temp4;
- int pp=1;
- do
- {
- if(pp!=1)
- {
- for(int i=0;i<tree4.size();i++)
- {
- tree[i].h.clear();
- tree[i].h=tree4[i].h;
- tree[i].left_child=tree4[i].left_child;
- tree[i].right_child=tree4[i].right_child;
- tree[i].val=tree4[i].val;
- tree[i].w.clear();
- tree[i].w=tree4[i].w;
- }
- temp2.clear();
- temp2=temp4;
- pp++;
- }
- int Op=rand()%1;
- //Op=2;
- if(Op==0)
- {
- int i,j;
- i=rand()%temp2.size();
- while(tree[temp2[i]].val=="V" || tree[temp2[i]].val=="H")
- {
- i=rand()%temp2.size();
- }
- int j1=rand()%2;
- if(j1==0)
- {
- if(i==temp2.size()-1)
- {
- int k=i-1;
- while(tree[temp2[k]].val=="V" || tree[temp2[k]].val=="H")
- {
- k--;
- }
- int tempu;
- tempu=temp2[i];
- temp2[i]=temp2[k];
- temp2[k]=tempu;
- }
- else
- {
- int k=i+1;
- int flag=0;
- while(tree[temp2[k]].val=="V" || tree[temp2[k]].val=="H")
- {
- if(k==temp2.size()-1)
- {
- flag=1;
- break;
- }
- k++;
- }
- if(k==temp2.size()-1 && flag==1)
- {
- k=i-1;
- int flag=0;
- while(tree[temp2[k]].val=="V" || tree[temp2[k]].val=="H")
- {
- k--;
- }
- }
- int tempu;
- tempu=temp2[i];
- temp2[i]=temp2[k];
- temp2[k]=tempu;
- }
- }
- if(j1==1)
- {
- if(i==0)
- {
- int k=i+1;
- while(tree[temp2[k]].val=="V" || tree[temp2[k]].val=="H")
- {
- k++;
- }
- int tempu;
- tempu=temp2[i];
- temp2[i]=temp2[k];
- temp2[k]=tempu;
- }
- else
- {
- int k=i-1;
- //int flag=0;
- while(tree[temp2[k]].val=="V" || tree[temp2[k]].val=="H")
- {
- k--;
- }
- int tempu;
- tempu=temp2[i];
- temp2[i]=temp2[k];
- temp2[k]=tempu;
- }
- }
- }
- else if(Op==1)
- {
- int i,j;
- i=rand()%temp2.size();
- while(!(tree[temp2[i]].val=="V" || tree[temp2[i]].val=="H"))
- {
- i=rand()%temp2.size();
- }
- if(tree[temp2[i]].val=="H")
- {
- tree[temp2[i]].val="V";
- }
- else if(tree[temp2[i]].val=="V")
- {
- tree[temp2[i]].val="H";
- }
- int k1=i+1;
- //vactor<int > invert;
- while(k1 <temp2.size() && (tree[temp2[k1]].val=="V" || tree[temp2[k1]].val=="H"))
- {
- if(tree[temp2[k1]].val=="H")
- {
- tree[temp2[k1]].val="V";
- }
- else if(tree[temp2[k1]].val=="V")
- {
- tree[temp2[k1]].val="H";
- }
- k1++;
- }
- //cout<<k1<<" ";//k--;
- k1=i-1;
- while((tree[temp2[k1]].val=="V" || tree[temp2[k1]].val=="H") && k1>=0)
- {
- if(tree[temp2[k1]].val=="H")
- {
- tree[temp2[k1]].val="V";
- }
- else if(tree[temp2[k1]].val=="V")
- {
- tree[temp2[k1]].val="H";
- }
- k1--;
- }
- }
- else if(Op==2)
- {
- //bool done=false;
- for(int ii=0;ii<50;ii++)
- {
- int i,j;
- i=1+rand()%(temp2.size()-3);
- if((tree[temp2[i]].val=="H" || tree[temp2[i]].val=="V") && !(tree[temp2[i+1]].val=="H" || tree[temp2[i+1]].val=="V"))
- {
- if(tree[temp2[i]].val!=tree[temp2[i+2]].val)
- {
- int tmp;
- tmp=temp2[i];
- temp2[i]=temp2[i+1];
- temp2[i+1]=tmp;
- break;
- }
- }
- if(!(tree[temp2[i]].val=="H" || tree[temp2[i]].val=="V") && (tree[temp2[i+1]].val=="H" || tree[temp2[i+1]].val=="V"))
- {
- if(tree[temp2[i-1]].val!=tree[temp2[i+1]].val)
- {
- vector<int > tmp2;
- tmp2=temp2;
- int tmp;
- tmp=tmp2[i];
- tmp2[i]=tmp2[i+1];
- tmp2[i+1]=tmp;
- // cout<<"vitre ";
- for(int yy=0;yy<tmp2.size();yy++)
- {
- // cout<<tree[tmp2[yy]].val<<" ";
- }
- // cout<<"\n";
- int count1=0;
- int count2=0;
- int flag=0;
- for(int i=0;i<tmp2.size();i++)
- {
- count1=0;
- count2=0;
- for(int j=0;j<=i;j++)
- {
- if(tree[tmp2[j]].val=="H")
- {
- count1++;
- }
- else if(tree2[tmp2[j]].val=="V")
- {
- count1++;
- }
- else
- {
- count2++;
- }
- }
- // cout<<count1<<" "<<count2<<"\n";
- if(count1>=count2)
- {
- flag=1;
- //cout<<flag<<" ";
- break;
- }
- }
- if(flag==0)
- {
- temp2=tmp2;
- // done=true;
- break;
- }
- }
- }
- for(int yy=0;yy<temp2.size();yy++)
- {
- // cout<<tree[temp2[yy]].val<<" ";
- }
- // cout<<"\n";
- }
- }
- for(int yy=0;yy<temp2.size();yy++)
- {
- cout<<tree[temp2[yy]].val<<" ";
- }
- cout<<"\n";
- vector<node*> tree3;
- vector<int>temp3;
- stack <node*> newtree;
- for(int m=0;m<temp2.size();m++)
- {
- if(tree[temp2[m]].val!="V" && tree[temp2[m]].val!="H")
- {
- node *tmp;
- tmp=new node;
- tmp->val=tree[temp2[m]].val;
- // node tt1,tt2;
- // tt1.val="\0";
- //tt2.val="\0";
- tmp->left_child=NULL;
- tmp->right_child=NULL;
- for(int n=0;n<tree[temp2[m]].w.size();n++)
- {
- tmp->w.push_back(tree[temp2[m]].w[n]);
- }
- for(int n=0;n<tree[temp2[m]].w.size();n++)
- {
- tmp->h.push_back(tree[temp2[m]].h[n]);
- }
- tree3.push_back(tmp);
- newtree.push(tmp);
- }
- else
- {
- // cout << "New Else " << endl;
- node *tmp;
- node *tmp2;
- node *tmp3;
- tmp= new node;
- tmp2= new node;
- tmp3= new node;
- tmp->val=tree[temp2[m]].val;
- //int sz1=newtree.size();
- tmp2=newtree.top();
- //cout<< "right child " << tmp2->val<<" s ";
- newtree.pop();
- tmp->right_child=tmp2;
- //int sz2=newtree.size();
- tmp3=newtree.top();
- //cout << "left child" <<tmp3->val<<"\n";
- newtree.pop();
- tmp->left_child=tmp3;
- //cout<<tmp->left_child->val<<" vvvvv \n";
- //cout<<tmp->left_child->val<<" "<<tmp->right_child->val<<"\n";
- tree3.push_back(tmp);
- newtree.push(tmp);
- //cout<<newtree[newtree.size()-1].left_child->val<<" "<<newtree[newtree.size()-1].right_child->val<<"\n";
- // cout<<tmp->left_child->val<<" "<<tmp->right_child->val<<"\n";
- // cout<<"current tree:\n";
- //cout<<"\n";
- //cout<<"current vector:\n";
- }
- temp3.push_back(m);
- }
- for(int i=0;i<tree.size();i++)
- {
- tree[i].h.clear();
- tree[i].h=tree3[i]->h;
- tree[i].left_child=tree3[i]->left_child;
- tree[i].right_child=tree3[i]->right_child;
- if(tree[i].left_child!=NULL)
- {
- // cout<<tree3[i]->left_child->val<<" ";
- // cout<<tree3[i]->right_child->val<<"\n";
- }
- tree[i].val=tree3[i]->val;
- tree[i].w.clear();
- tree[i].w=tree3[i]->w;
- }
- temp2.clear();
- temp2=temp3;
- for(int i=0;i<tree.size();i++)
- {
- cout<<tree[i].val<<"\n";
- if(tree[i].left_child!=NULL)
- {
- cout<<tree[i].left_child->val<<" "<<tree[i].right_child->val<<"\n";
- for(int j=0;j<tree[i].left_child->h.size();j++)
- {
- cout<<tree[i].left_child->h[j]<<" "<<tree[i].w[j]<<"\n";
- }
- for(int j=0;j<tree[i].right_child->h.size();j++)
- {
- cout<<tree[i].right_child->h[j]<<" "<<tree[i].w[j]<<"\n";
- }
- }
- for(int j=0;j<tree[i].h.size();j++)
- {
- cout<<tree[i].h[j]<<" "<<tree[i].w[j]<<"\n";
- }
- }
- for(int g=0;g<newtree.size();g++)
- {
- // cout<<newtree[g]->val<<"\n";
- }
- //cout<<"\n";
- for(int yy=0;yy<temp2.size();yy++)
- {
- cout<<temp2[yy]<<" ";
- }
- cout<<"\n";
- /* int newarea=area();
- int difcost=newarea-oldarea;
- cout<<difcost<<" "<<newarea<<" "<<oldarea<<"cost\n";
- if(difcost<0)
- {
- tree4=tree;
- temp4.clear();
- temp4=temp2;
- if(newarea<bestcost)
- {
- Ebest.clear();
- Ebest=temp2;
- }
- cout<<oldarea<<" ber hoisi\n"<<newarea<<"\n";
- oldarea=newarea;
- for(int i=0;i<tree4.size();i++)
- {
- cout<<tree4[i].val<<"\n";
- if(tree4[i].left_child!=NULL)
- {
- cout<<tree4[i].left_child->val<<" "<<tree4[i].right_child->val<<"\n";
- }
- for(int j=0;j<tree4[i].h.size();j++)
- {
- cout<<tree4[i].h[j]<<" "<<tree4[i].w[j]<<"\n";
- }
- }
- }
- else if(difcost>=0)
- {
- double test=-difcost/T;
- double enlog=pow(2.71828,test);
- double f=(rand()%100)/100;
- if(enlog>f)
- {
- for(int i=0;i<tree.size();i++)
- {
- tree4[i].h.clear();
- tree4[i].h=tree[i].h;
- tree4[i].left_child=tree[i].left_child;
- tree4[i].right_child=tree[i].right_child;
- tree4[i].val=tree[i].val;
- tree4[i].w.clear();
- tree4[i].w=tree[i].w;
- }
- temp4.clear();
- temp4=temp2;
- oldarea=newarea;
- }
- }
- T=r*T;
- */
- }while (T > efsilon);
- return;
- }
- int main()
- {
- ifstream myfile ("C:\\Users\\world co\\Desktop\\Hardware\\input.txt");
- string line1;
- vector < string > leaf;
- vector <int > width;
- vector <int > height;
- int k1=0;
- while(getline(myfile,line1))
- {
- string token1;
- istringstream ss;
- ss.clear();
- ss.str(line1);
- int j=0;
- while(getline(ss,token1,' '))
- {
- if(j==0)
- {
- string omuk=token1.c_str();
- leaf.push_back(omuk);
- }
- if(j==1)
- {
- int tomuk=atoi(token1.c_str());
- width.push_back(tomuk);
- }
- if(j==2)
- {
- int tomuk2=atoi(token1.c_str());
- height.push_back(tomuk2);
- }
- //break;
- j++;
- }
- //cout<<leaf[k1]<<" "<<width[k1]<<" "<<height[k1]<<"\n";
- k1++;
- }
- //cout<<k1<<"\n";
- //char leaf2[k1];
- for(int i=0;i<k1;i++)
- {
- //int i;
- //char buffer [33];
- //leaf2[i]= leaf[i]+48;
- }
- int cc=2*k1-1-k1;
- for(int i=0;i<cc;i++)
- {
- node temp;
- int choice=rand()%2;
- if(choice==0)
- {
- temp.val="H";
- }
- else if(choice==1)
- {
- temp.val="V";
- }
- tree.push_back(temp);
- }
- for(int i=0;i<k1;i++)
- {
- node temp;
- temp.val=leaf[i];
- temp.h.push_back(height[i]);
- temp.w.push_back(width[i]);
- temp.w.push_back(height[i]);
- temp.h.push_back(width[i]);
- // node tt1,tt2;
- // tt1.val="\0";
- // tt2.val="\0";
- temp.left_child=NULL;
- temp.right_child=NULL;
- tree.push_back(temp);
- }
- for(int i=0;i<cc;i++)
- {
- tree[i].left_child=&tree[2*i+1];
- tree[i].right_child=&tree[2*i+2];
- // cout<<tree[i].left_child<<" "<<tree[i].right_child<<"\n";
- }
- for(int i=0;i<k1/2;i++)
- {
- if(tree[i].val==tree[2*i+2].val)
- {
- if(tree[2*i+2].val=="V")
- tree[2*i+2].val="H";
- else
- tree[2*i+2].val="V";
- }
- }
- for(int i=0;i<cc+k1;i++)
- {
- //tree[i].left_child=tree[2*i+1].val;
- //tree[i].right_child,tree[2*i+2].val;
- // cout<<tree[i].val<<"\n";
- //cout<<tree[i].left_child<<" "<<tree[i].right_child<<"\n";
- }
- //vector <string> tempp;
- temp.clear();
- postorder(0,tree.size());
- for(int i=0;i<temp.size();i++)
- {
- //cout<<temp[i]<<"\n";
- }
- for(int i=0;i<tree.size();i++)
- {
- //cout<<tree[i].val<<" "<<tree[i].left_child<<" "<<tree[i].right_child<<"\n";
- for(int j=0;j<tree[i].h.size();j++)
- {
- // cout<<tree[i].h[j]<<" "<<tree[i].w[j]<<"\n";
- }
- }
- //temp2.clear();
- //postorder2(0,tree.size());
- //cout<<"thik";
- //int a=area();
- //cout<<a;
- algorithm();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement