Cod sursa(job #2568129)

Utilizator danutbodbodnariuc danut danutbod Data 3 martie 2020 21:02:06
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 102.39 kb
//Bellman Ford O(m*n) 100p  ultima varianta  cu viz[]!!!
//pun in coada numai nodurile nevizitate deja
//dar tot creapa testul 9
#include<fstream>
#include<iostream>
#define inf 1000000000
#define NMax 50003
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
struct Nod
{
    int nod, cost;
    Nod *next;
};
Nod *t,*Vecin[NMax];
int i,j,m,n,x,y,costul,p,u,nod;
int viz[NMax],d[NMax],coada[30*NMax];

void adauga(int x, int y, int costul){
    Nod *q = new Nod;
    q->nod = y;
    q->cost = costul;
    q->next = Vecin[x];
    Vecin[x] = q;
}
int main()
{
    //cout<<sizeof(coada);
    f>>n>>m;
    for(i=1;i<=m;++i)
     {
        f>>x>>y>>costul;
        adauga(x,y,costul);
     }
    for(i=1;i<=n;++i) d[i]=inf;
    p=1;u=1;
    coada[u]=1;
    viz[1]=1;
    d[1]=0;
    while (p<=u)
     {
        j=coada[p];
        viz[j]=0;
        p++;
        t=Vecin[j];
        while(t){
           if(d[t->nod]>d[j]+t->cost)
            {
                d[t->nod]=d[j]+t->cost;
                if(viz[t->nod]==0){
                     coada[++u]=t->nod;
                     viz[t->nod]=1;
                }
            }
           t=t->next;
        }
       // cout<<u<<'\n';
    }

    for ( int i = 2; i <= n; i++ )
        if(d[i] == inf) g<<0<<" ";else g<< d[i]<<" ";
    f.close();
    g.close();
}
////infoarena Dijkstra  afisare valori minime de la nodul 1
////Bellman Ford O(m*n) 100p   n=50.000
//// cu pointeri
//#include<fstream>
//#define inf 1000000000
//#define NMax 50003
//using namespace std;
//ifstream f("dijkstra.in");
//ofstream g("dijkstra.out");
//struct Nod
//{
//    int nod, cost;
//    Nod *urm;
//};
//Nod *t,*L[NMax];
//int j,m,n,x,y,costul,nod,d[NMax],coada[5*NMax];
//void adauga(int x, int y, int costul)
//{
//    Nod *q = new Nod;
//    q->nod = y;
//    q->cost = costul;
//    q->urm = L[x];
//    L[x] = q;
//}
//void bellman_ford(){
//    int p,u,i;
//    for(i=1;i<=n;i++) d[i]=inf;
//    p=1;u=1;
//    coada[u]=1;
//    d[1]=0;
//    while (p<=u)
//     {
//        j=coada[p];p++;
//        t=L[j];
//        while(t){
//           if(d[t->nod]>d[j]+t->cost)
//            {
//                coada[++u]=t->nod;
//                d[t->nod]=d[j]+t->cost;
//            }
//           t=t->urm;
//        }
//    }
//}
//int main()
//{
//    int i;
//    f>>n>>m;
//    for(i=1;i<=m;i++)
//     {
//        f>>x>>y>>costul;
//        adauga(x,y,costul);
//     }
//    bellman_ford();
//    for ( int i = 2; i <= n; i++ )
//        if(d[i] == inf) g<<0<<" ";else g<< d[i]<<" ";
//    f.close();
//    g.close();
//}



//#include<algorithm>
//#include <fstream>
//#define N 100003
//#define M 200003
//using namespace std;
//ifstream fi("ctc.in");
//ofstream fo("ctc.out");
//struct nod{
//    int x;
//    nod*urm;
// };
// nod *L[N],*LT[N],*ctc[N];
// nod*p;
// int viz[N],vizt[N],i,j,k,n,m,x,y;
// int st[N],nc;
//void Adauga(nod*V[],int i,int j){//pune in coada lui i(V[i]) nodul j in graf
//  nod*p;                  //adauga in e liste de adiacenta L,LT,ctc
//  p=new nod;
//  p->x=j;
//  //pune in coada lui i nodul j
//  p->urm=V[i];
//  V[i]=p;
// }
//void dfs(int j){  //plus
//   nod *p;
//   viz[j]=1;
//   p=L[j];
//   while(p){
//    if(viz[p->x]==0)dfs(p->x);
//     p=p->urm;
//   }
// st[++k]=j;
//}
//void dfst(int j){  //minus
//   nod *p;
//   Adauga(ctc,nc,j);
//   vizt[j]=1;
//   p=LT[j];
//   while(p){
//    if(vizt[p->x]==0)dfst(p->x);
//     p=p->urm;
//   }
//}
//int main(){
//    fi>>n>>m;
//    for(i=1;i<=m;i++){
//        fi>>x>>y;
//        Adauga(L,x,y);//mem graf normal
//        Adauga(LT,y,x);//mem graf transpus
//    }
//    for(i=1;i<=n;i++)      //parcurgere graf normal
//        if(viz[i]==0)dfs(i);
//    for(i=k;i>=1;i--)   //parcurgere stiva pe graful transpus
//        if(vizt[st[i]]==0)
//             {nc++;dfst(st[i]);}
////    fo<<nc<<'\n';
////    for(i=1;i<=nc;i++){  //afisare ctc
////         p=ctc[i];
////         while(p){
////                fo<<p->x<<" ";
////                p=p->urm;
////        }
////        fo<<'\n';
////    }
//return 0;
//}
//#include <fstream>//100p O(n+m) (Kosaraju)
//#include<vector>
//#define Nmax 100001
//using namespace std;
//ifstream f("ctc.in"); ofstream g("ctc.out");
//vector <int> a[Nmax];
//vector <int> at[Nmax];vector <int> ctc[Nmax];
//int n, m,k,nrc, viz[Nmax],st[Nmax];
//void df (int nod)
//{
//  int i;
//  viz[nod] = 1;
//  for (i = 0; i < a[nod].size(); i++)
//    if (viz[a[nod][i]]==0) df(a[nod][i]);
//  st[++k]=nod;
//}
//void dft (int nod) //df transpus
//{
//  int i;
//  viz[nod] = 1;ctc[nrc].push_back(nod);
//  for (i = 0; i < at[nod].size(); i++)
//    if (viz[at[nod][i]]==0)
//       dft(at[nod][i]);
//}
//int main() {
//  int i, j, x, y;
//  f >> n >> m;
//  for (i = 1; i <= m; i++)
//  {
//    f >> x >> y;
//    a[x].push_back(y);
//    at[y].push_back(x);
//  }
//
////for(i=1;i<=n;i++){for (j=0; j<at[i].size();j++) g<<at[i][j]<<" "; g<<'\n';}
//for (i = 1; i <= n; i++)
//    if (viz[i]==0)  df(i);
////for(i=1;i<=n;i++)g<<st[i]<<" ";g<<endl;
// for (i = 1; i <= n; i++) viz[i]=0;
// for (i = n; i >=1; i--)
//    if (viz[st[i]]==0)  {
//             nrc++;
//             dft(st[i]);
//            }
//g<<nrc<<'\n';
//for(i=1;i<=nrc;i++){
// for (j=0; j<ctc[i].size();j++)
//   g<<ctc[i][j]<<" ";
// g<<'\n';
//}
//  return 0;
//}
//#include<fstream>
//using namespace std;
//ifstream fi("arb.in");
//ofstream fo("arb.out");
//struct Nod{
//int info;
//Nod *st,*dr;
//}*r;
//int i,n,x;
//void inserare(Nod*&r,int x){
//Nod*q,*p=new Nod;
//p->info=x;
//p->st=0;
//p->dr=0;
//if(r==0){r=p;return;}
//q=r;
//while(1){
//    if(q->info==x){delete p;return;}
//    if(x<q->info)
//        if(q->st)q=q->st;
//        else {q->st=p; return;}
//    else
//        if(q->dr)q=q->dr;
//        else {q->dr=p; return;}
//    }
//}
//void afisare(Nod*r){
//if(r){
//    afisare(r->st);
//    fo<<r->info<< " ";
//    afisare(r->dr);
//}
//}
//int cautare(Nod*r,int x){
//if(r){
//        if(x==r->info)return 1;
//        else if(x<r->info)cautare(r->st,x);
//             else cautare(r->dr,x);
//    }
//    else return 0;
//}
////stergere
////echilibrare
//int main(){
//    r=0;
//    fi>>n;
//    for(i=1;i<=n;i++)
//        {fi>>x;
//         inserare(r,x);
//        }
//    afisare(r);
//    fo<<endl<<cautare(r,41);
//return 0;
//}
////alg lui Prim
//// - arbore partial de cost minim
//#include <fstream>
//using namespace std;
//ifstream fi("gr.in");
//ofstream fo("gr.out");
//struct muchie{
//int x,y,c;
//};
//muchie mu[10000];
//int n,i,j,k,t,m,c1,c2,mini,cost_arb;
//int a[10000];
//int main()
//{
//    fi>>n>>m;
//    for(i=1;i<=m;i++)
//      fi>>mu[i].x>>mu[i].y>>mu[i].c;
//   //  for(i=1;i<=m;i++)
////      fo<<mu[i].x<<" "<<mu[i].y<<" "<<mu[i].c<<endl;;
//    a[1]=1;//se alege primul nod in multimea finala
//    k=1;
//    while(k<n){
//        mini=1000000;  //aflam muchia de cost minim ce leaga
//        for(i=1;i<=m;i++)   //grupul final de exterior
//          if(a[mu[i].x]!=a[mu[i].y])
//            if(mu[i].c<mini){mini=mu[i].c;t=i;} //muchia t este minima
//        k++;
//        cost_arb+=mu[t].c;
//        a[mu[t].x]=a[mu[t].y]=1;  //pun in multimea finala capetele muchiei selectate
//        fo<< mu[t].x<<" "<<mu[t].y<<" "<<mu[t].c<<endl;//afisez muchia selectata
//       }
//fo<<endl<<cost_arb;
//        return 0;
//}


////problema turnurilor lui Hanoi  2n-1 operatii pentru n discuri
////Se dau 3 tije notate cu a,b,c. Pe discul a se gasesc n discuri asezate in descrescatoare se sus in jos.
////Se cere  sa se mute discurile de pe tija a pe tija c(cu intermediar b) respectand urmatoarele reguli:
//#include <fstream>
//using namespace std;
//fstream f("han.in", ios::in);
//fstream g("han.out", ios::out);
//char a,b,c;
//int n;
//void han(int n,char a,char b,char c)
//{
// if(n==1) g<<a<<"->"<<c<<'\n';
// else
// {
//  han(n-1,a,c,b);
//  g<<a<<"->"<<c<<'\n';
//  han(n-1,b,a,c);
// }
//}
//int main()
//{
// f>>n;
// a='A'; b='B'; c='C';
// g<<2*n-1<<'\n';
// han(n,a,c,b);
//return 0;
//}


//#include<iostream>
//using namespace std;
//struct nod
//{
//    int info;
//    nod*urm;
//}*prim;
//void adauga(nod*&prim,int x)
//{
//    nod*q,*p=new nod;
//    p->info=x;
//    p->urm=0;
//    if(prim==0)
//    {
//        prim=p;
//    }
//    else
//    {
//        q=prim;
//        while(q->urm)q=q->urm;
//        q->urm=p;
//    }
//}
//void listare(nod* prim){
//nod*p;
//p=prim;
//while(p){
//    cout<<p->info<<" ";
//    p=p->urm;
//}
//cout<<endl;
//}
//void ins_cresc(nod *&p, int x){
//nod*q,*t;
//t=new nod;
//t->info=x;
//t->urm=0;
//if(x<p->info){t->urm=p;p=t;return; }//adaug primul el
//q=p;
//while(q->urm->info<=x){q=q->urm;
//
//}
//}
//int n,i,x;
//int main()
//{
//    cin>>n;
//    for(i=1; i<=n; i++)
//    {
//        cin>>x;
//        adauga(prim,x);
//    }
//    listare(prim);
//    inserare(prim);
//    listare(prim);
//    return 0;
//}
////var I cu upper_bound
//#include<fstream>
//#include<algorithm>
//#define M 100003
//using namespace std;
//ifstream fi("maraton.in");
//ofstream fo("maraton.out");
//long long q,d,v,t,timp,j,k,i,n,a[M],b[M];
////fara long long nu merge bine !!! (nu stiu de ce)
//int main() {
//    fi>>n;
//    for(i=1;i<=n;i++) {
//            fi>>d>>v;
//            timp=d/v;
//            if(d%v!=0)timp++;//timp=2.3 => 3
//            a[i]=timp;
//    }
//    sort(a+1,a+n+1);
//    //for(i=1;i<=n;i++) fo<<a[i]<<' ';fo<<endl;
//    fi>>k;
//    for(i=1;i<=k;i++){
//        fi>>t;
//        fo<<(upper_bound(a+1,a+n+1,t)-a)-1<<'\n';
//    }
//    return 0;
//}
//var II manuala
//#include<fstream>
//#include<algorithm>
//#define M 100003
//using namespace std;
//ifstream fi("maraton.in");
//ofstream fo("maraton.out");
//int q,d,v,t,timp,j,k,i,n,a[M],b[M];
////cauta binar pozitia primului element mai mare ca x
////trebuie pus un element in plus al sfarsit
////    n++;
////    a[n]=a[n-1]+3;
//int cauta_binDR(int x){
// int st,dr,mij;
// st=1;dr=n;
// while(st<dr)
// {
//   mij=(st+dr)/2;
//   if(x>=a[mij])st=mij+1;
//   else dr=mij;
// }
//return st;
//}
//int main() {
//    fi>>n;
//    for(i=1;i<=n;i++) {
//            fi>>d>>v;
//            timp=d/v;
//            if(d%v!=0)timp++;//timp=2.3 => 3
//            a[i]=timp;
//    }
//    sort(a+1,a+n+1);
//    n++;
//    a[n]=a[n-1]+3;
//    //for(i=1;i<=n;i++) fo<<a[i]<<' ';fo<<endl;
//    fi>>k;
//    for(i=1;i<=k;i++){
//        fi>>t;
//        fo<<cauta_binDR(t)-1<<'\n';
//    }
//    return 0;
//}
//// var I
////paduri de multimi disjuncte
//// cu compresia drumurilor ( cu T[rad]=0; )
//#include<iostream>
//#include <fstream>
//#define M 100003
//#define fi cin
//#define fo cout
//using namespace std;
////ifstream fi("gasti.in");
////ofstream fo("gasti.out");
//int nrc,k,T[M],a[5*M],b[5*M];//vectorul de tati(T[] )
//int r1,r2,i,n,m,x,y,op,RT[M],sol[5*M];
//int rad(int x)	 //afla radacina nodului x
//{
//	int r, y;
//    r=x;                 //merg in sus pe arbore pana gasesc radacina
//    while(T[r]!=0)r=T[r];// un nod cu tata 0)
//    while(T[x]!=0)     //aplic compresia drumurilor
//      {  y = T[x]; T[x] = r;  x = y;  }
//    return r; //returnez radacina
//
//}
//void reuneste( int x,int y)
//{
//    if(RT[x]>RT[y]) T[y]=x;     //unesc multimea cu rang mai mic de cea cu rang mai mare
//    else T[x]=y;
//    if(RT[x]==RT[y]) RT[y]++;   //in caz ca rangurile erau egale atunci cresc
//}                               //rangul noii multimi cu 1
//int main()
//{
//    fi>>n>>m;
//	for(i=1;i<=m;i++) fi>>a[i]>>b[i];
//	nrc=n;
//	sol[++k]=nrc;
//	for(i=m;i>1;i--){
//        r1=rad(a[i]);
//        r2=rad(b[i]);
//        if(r1==r2)sol[++k]=nrc;
//        else {sol[++k]=--nrc;reuneste(r1,r2);}
//	}
//	for(i=k;i>=1;i--)fo<<sol[i]<<'\n';
//    return 0;
//
//}


////deque (pronounced like "deck")(acronym of double-ended queue)
//
//// (nu mai trebuie sa dau lungimea cozii!!!!
//
////operatii
//
////c.empty()  - da true daca c este vida
//
////w=c.front(); -citeste w !!! elementul din capul cozii
//
////w=c.back(); -citeste w !!! elementul din sfarsitul listei cozii
//
////c.pop_front();   - extrage elemtul de la inceputul cozii
//
////c.pop_back();    - extrage elemtul de la sfarsitul cozii
//
////c.push_back(w); -pune w la sfarsitul cozii
//
////c.push_front(w); -pune w inceputul cozii
//
////c.swap(c1);   - inverseaza coada c cu c1
//
////c.clear()  -sterge toate elementele din lista
//
//#include<fstream>
//
//#include<iostream>
//
//#include<deque>
//
//using namespace std;
//
//ifstream fi("muzeu.in");
//
//ofstream fo("muzeu.out");
//
//struct punct
//
//{ int i, j;}w;
//
//deque <punct> c;
//
//int n,i,j;
//
//char a[255][255];
//
//int b[255][255];
//
//int di[]={ 1, -1, 0,  0};//S N E V
//
//int dj[]={ 0,  0, 1, -1};
//
//
//
//void Lee()
//
//{
//
//    int k, ii, jj,i,j;
//
//    punct w, w1;
//
//    while(!c.empty())  //daca coada nu este vida
//
//    {
//
//        w=c.front();   //citeste el. din coada
//
//        i = w.i;
//
//        j = w.j;
//
//        c.pop_front();      //avanseaza in coada
//
//        for(k=0;k<4;k++)
//
//        {
//
//            ii = i + di[k];
//
//            jj = j + dj[k];
//
//            if((ii > 0 && ii <= n && jj > 0 && jj <= n)
//
//               &&(b[ii][jj]>b[i][j]+1 || b[ii][jj] ==0 ) && a[ii][jj] == '.')
//
//            {
//
//                b[ii][jj]=b[i][j]+1;
//
//                w1.i = ii;
//
//                w1.j = jj;
//
//                c.push_back(w1);  //pune in coada
//
//            }
//
//        }
//
//    }
//
//}
//
//
//
//int main()
//
//{
//
//    fi>>n;
//
//    for(i=1;i<=n;i++)
//
//        for(j=1;j<=n;j++){
//
//            fi>>a[i][j];
//
//            if(a[i][j]=='P')
//
//            {
//
//                w.i=i;
//
//                w.j=j;
//
//                c.push_back(w);
//
//            }
//
//            if(a[i][j]=='#')b[i][j] = -2;
//
//        }
//
//    Lee();
//
//    for(i = 1; i <= n; i++)
//
//    {for(j = 1; j <= n; j++)
//
//        {
//
//            if(a[i][j]!='P' && b[i][j]==0)  b[i][j]=-1;
//
//            fo<<b[i][j]<<" ";
//
//        }
//
//        fo<<"\n";
//
//    }
//
//    return 0;
//
//}



//#include<fstream>//deque cu struct

//#include<iostream>

//#include<deque>

//using namespace std;

//ifstream fi("masina2.in");

//ofstream fo("masina2.out");

//struct punct

//{ int i, j;}w;

//deque <punct> c;

//int i,n,x,y,t;

//int main(){

// fi>>n;

// for(i=1;i<=n;i++){

//        fi>>w.i>>w.j;

//        c.push_back(w);

//        }

//for(t=0;t<c.size();t++)  //afisare el.cu at()

//            fo<<c.at(t).i <<" "<<c.at(t).j<<endl;;

// while(!c.empty()){  //afisare deque

//    w=c.front();

//    c.pop_front();

//    fo<<w.i<<" "<<w.j<<endl;;

// }

//return 0;

//}

//#include<fstream>

//#include<iostream>

//#include<deque>

//using namespace std;

//ifstream fi("masina2.in");

//ofstream fo("masina2.out");

//struct punct

//{ int i, j;};

//deque <int> c;

//int i,n,x,y;

//int main(){

// fi>>n;

// for(i=1;i<=n;i++){

//        fi>>x;

//        c.push_back(x);

//        }

//for(i=0;i<c.size();i++)  //afisare el.cu at()

//            fo<<c.at(i)<<" ";

// while(!c.empty()){  //afisare deque

//    y=c.front();

//    c.pop_front();

//    fo<<y<<" ";

// }

//return 0;

//}











//#include<fstream>

//#include<iostream>

//#include<deque>

//using namespace std;

//ifstream fi("masina2.in");

//ofstream fo("masina2.out");

//struct punct

//{ int i, j;};

//deque <punct> c1;

//deque <punct> c2;

//int n,i,j,R,C;

//char a[55][55];

//int b[55][55],viz[55][55];

//int di[]={ 1, -1, 0,  0};//S N E V

//int dj[]={ 0,  0, 1, -1};

//    int k, ii, jj;char sir[10],z;

//    punct w, w1;

//int main()

//{

//    fi>>R>>C;

//    for(i=1;i<=R;i++)

//        for(j=1;j<=C;j++){

//            fi>>a[i][j];

//            if(a[i][j]=='*')

//            {   w.i=i;  w.j=j;  c1.push_back(w);  }

//            if(a[i][j]=='X')b[i][j] = -2;

//        }

//

////for(z=0;z<c1.size();z++)cout<<c1.at(z).i<<" "<<c1.at(z).j<<endl;

//    fi>>n;fi.get();

//    for(int p=1;p<=n;p++){   //luam fiecare directie

//        fi.get(sir,10);fi.get();//S N E V

//        if(sir[0]=='S')k=0;

//        if(sir[0]=='N')k=1;

//        if(sir[0]=='E')k=2;

//        if(sir[0]=='V')k=3;

//        while(!c1.empty()){  //daca coada nu este vida

//            w=c1.front();   //citeste el. din coada

//            i = w.i; j = w.j;

//            c1.pop_front();      //avanseaza in coada

//            do{                  //pune in coada c2 toate punctele accesibile pentru fiecare punct din coada c1

//               ii = i + di[k];

//               jj = j + dj[k];

//               if((ii > 0 && ii <= R && jj > 0 && jj <= C)&&( b[ii][jj] ==0 )

//                                     &&viz[ii][jj]==0)   //pune de mai multe ori acelasi punct in coada fara asta!!!

//                {

//                w1.i = ii; w1.j = jj; c2.push_back(w1);  //pune in coada

//                viz[ii][jj]=1;

//                }

//               i=ii;j=jj;

//              }while(b[i][j]==0);

//       }

//    //   for(z=0;z<c2.size();z++)cout<<c2.at(z).i<<" "<<c2.at(z).j<<endl;

//      //se pune in coada c1 coada c2

//      c1.swap(c2);//inverseaza continutul cozilor

//      c2.clear(); //sterge tot din coada c2

//      for(i=1;i<=R;i++)

//        for(j=1;j<=C;j++)viz[i][j]=0;

//      //cout<<c1.size()<<" "<<c2.size()<<endl;

//    }

//    while(!c1.empty()){w=c1.front();c1.pop_front();b[w.i][w.j]=2;}

//    for(i = 1; i <= R; i++)

//    {for(j = 1; j <= C; j++)

//        {

//            if(b[i][j]==0)  fo<<".";

//            if(b[i][j]==-2) fo<<"X";

//            if(b[i][j]==2)  fo<<"*";

//

//        }

//        fo<<"\n";

//    }

//    return 0;

//}

//#include<fstream>//deque cu struct

//#include<iostream>

//#include<deque>

//using namespace std;

//ifstream fi("masina2.in");

//ofstream fo("masina2.out");

//struct punct

//{ int i, j;}w;

//deque <punct> c;

//int i,n,x,y,t;

//int main(){

// fi>>n;

// for(i=1;i<=n;i++){

//        fi>>w.i>>w.j;

//        c.push_back(w);

//        }

//for(t=0;t<c.size();t++)  //afisare el.cu at()

//            fo<<c.at(t).i <<" "<<c.at(t).j<<endl;;

// while(!c.empty()){  //afisare deque

//    w=c.front();

//    c.pop_front();

//    fo<<w.i<<" "<<w.j<<endl;;

// }

//return 0;

//}

//#include<fstream>

//#include<iostream>

//#include<deque>

//using namespace std;

//ifstream fi("masina2.in");

//ofstream fo("masina2.out");

//struct punct

//{ int i, j;};

//deque <int> c;

//int i,n,x,y;

//int main(){

// fi>>n;

// for(i=1;i<=n;i++){

//        fi>>x;

//        c.push_back(x);

//        }

//for(i=0;i<c.size();i++)  //afisare el.cu at()

//            fo<<c.at(i)<<" ";

// while(!c.empty()){  //afisare deque

//    y=c.front();

//    c.pop_front();

//    fo<<y<<" ";

// }

//return 0;

//}


//// 50p cu mat. de adiacenta(nu incape)
//// Parcurgerea Breadth First(BF) var III BFS infoarena
//#include <fstream>
//#define nmax 5600
//using namespace std;
//ifstream f("bfs.in");
//ofstream g("bfs.out");
//int n,m,a[nmax][nmax],x,y,c[nmax],u,p,viz[nmax],i,v,s;
//void bfs(int x,int numar){
// int i,p,u,v;
// p=1; u=1;
// c[1]=x; viz[x]=numar;
// while(p<=u)
// {
// v=c[p]; //se ia nodul din varful cozii
// for(i=1;i<=n;i++)
// if(a[v][i]==1 && viz[i]==0) //se cauta toti vecinii nevizitati
// { //pentru nodul v
// u++;
// c[u]=i; //se pun in coada vecinii gasiti
// viz[i]=viz[v]+1;
// }
// p++;
// }
//}
//int main()
//{
// f >> n >> m >>s;
// for(i=1;i<=m;i++)
// {
// f >> x >> y;
// if(x!=y)a[x][y]=1;
// }
// bfs(s,1);
//
// for(i=1;i<=n;i++) g<<viz[i]-1<<" ";
// f.close(); g.close();
// return 0;
//}
//

////100p var I
////reprezentare graf cu lista de adiacenta (cu pointeri)
////implementare DF
////fac vector de frecventa cu numarul de noduri din fiecare
////componenta conexa - pentru numarare avem doua cazuri
////numarare solutii
////caz I 1 2 3 4 4 7 7 7 => sol=7*7+7*7+7*7
////(fiecare 7 cu fiecare 7)=(7*7)*nr7(nr7-1)/2
////caz II  cazul 2 3 5 5 5 7  =>sol=5*7+5*7+5*7
//#include<algorithm>
//#include <fstream>
//#define M 100003
//using namespace std;
//ifstream fi("gasti.in");
//ofstream fo("gasti.out");
//struct nod{
//    int x;
//    nod*urm;
// };
// nod *L[M];
// nod*p;
// int coada[M],viz[M],i,j,k,n,m,x,y;
// long long fr[M];
//void adauga(int i,int j){//pune in coada lui i(L[i]) nodul j
//  nod*p;
//  p=new nod;
//  p->x=j;
//  //pune in coada lui i nodul j
//  p->urm=L[i];
//  L[i]=p;
// }
//bool vecin(int i,int j){//verifica daca i si j sunt vecini
//  nod*p;
//  p=L[i];
//  while(p){
//    if(p->x==j)return true;
//    p=p->urm;
//  }
//  return false;
// }
//void DF(int y,int k){
//  nod*p;
//  viz[y]=k;
//  p=L[y];
//  while(p){
//    if(viz[p->x]==0)DF(p->x,k);
//    p=p->urm;
//  }
// }
//
//int main()
//{
//  fi>>n>>m;
//  for(i=1;i<=n;i++)L[i]=0;//se fac liste vide
//  for(i=1;i<=m;i++){
//    fi>>x>>y;
//    adauga(x,y);
//    adauga(y,x);
//  }
//  for(i=1;i<=n;i++)
//  if(viz[i]==0){k++;DF(i,k);}
//  for(i=1;i<=n;i++)fr[viz[i]]++;
//  fo<<k<<" ";
//  //b)
////    for(i=1;i<=n;i++)fo<<viz[i]<<" ";fo<<endl;
////  for(i=1;i<=k;i++)fo<<fr[i]<<" ";fo<<endl;
//  sort(fr+1,fr+k+1);
//  long long sol,nr;
//  int z;
//  if(fr[k]==fr[k-1]){ //cazul 1 2 3 4 4 7 7 7 => sol=7*7+7*7+7*7 (fiecare 7 cu fiecare 7)=(7*7)*nr7(nr7-1)/2
//    z=k;
//    while(z>1 and fr[z]==fr[z-1])z--;
//    nr=k-z+1; //nr==nr7
//    sol=(((fr[k]%666013)*(fr[k]%666013))%666013*(nr*(nr-1)/2)%666013)%666013;
//  }
//  else   //fr[k]!=fr[k-1]   cazul 2 3 5 5 5 7  =>sol=5*7+5*7+5*7
//  {
//    z=k;
//    sol=fr[k]*fr[k-1];
//    z--;
//    while(z>1 and fr[z]==fr[z-1]){sol=sol%666013+(fr[k]*fr[z-1])%666013;z--;}
//  }
//  fo<<sol%666013<<endl;;
//
//  return 0;
//}
////100p var II
////reprezentare graf cu lista de adiacenta (cu pointeri)
////implementare BF cu coada implementata dinamic manual cu pointeri
////fac vector de frecventa cu numarul de noduri din fiecare
////componenta conexa - pentru numarare avem doua cazuri
////numarare solutii
////caz I 1 2 3 4 4 7 7 7 => sol=7*7+7*7+7*7
////(fiecare 7 cu fiecare 7)=(7*7)*nr7(nr7-1)/2
////caz II  cazul 2 3 5 5 5 7  =>sol=5*7+5*7+5*7
//#include<algorithm>
//#include <fstream>
//#define M 100003
//using namespace std;
//ifstream fi("gasti.in");
//ofstream fo("gasti.out");
//struct nod{
//    int x;
//    nod*urm;
// };
// nod *L[M];
// nod*p;
// int coada[M],viz[M],i,j,k,n,m,x,y;
// long long fr[M];
//void adauga(int i,int j){//pune in coada lui i(L[i]) nodul j
//  nod*p;
//  p=new nod;
//  p->x=j;
//  //pune in coada lui i nodul j
//  p->urm=L[i];
//  L[i]=p;
// }
//bool vecin(int i,int j){//verifica daca i si j sunt vecini
//  nod*p;
//  p=L[i];
//  while(p){
//    if(p->x==j)return true;
//    p=p->urm;
//  }
//  return false;
// }
//
//void BF(int nod,int k){
//  int prim,ultim;
//  prim=ultim=1;
//  coada[ultim]=nod;
//  viz[nod]=k;
//  while(prim<=ultim){
//    nod=coada[prim];
//    prim++;
//    p=L[nod];
//    while(p){
//       if(viz[p->x]==0){
//                 coada[++ultim]=p->x;
//                 viz[p->x]=k;
//                }
//       p=p->urm;
//    }
//  }
// }
//int main()
//{
//  fi>>n>>m;
//  for(i=1;i<=n;i++)L[i]=0;//se fac liste vide
//  for(i=1;i<=m;i++){
//    fi>>x>>y;
//    adauga(x,y);
//    adauga(y,x);
//  }
//  for(i=1;i<=n;i++)
//  if(viz[i]==0){k++;BF(i,k);}
//  for(i=1;i<=n;i++)fr[viz[i]]++;
//  fo<<k<<" ";
//  //b)
////    for(i=1;i<=n;i++)fo<<viz[i]<<" ";fo<<endl;
////  for(i=1;i<=k;i++)fo<<fr[i]<<" ";fo<<endl;
//  sort(fr+1,fr+k+1);
//  long long sol,nr;
//  int z;
//  if(fr[k]==fr[k-1]){ //cazul 1 2 3 4 4 7 7 7 => sol=7*7+7*7+7*7 (fiecare 7 cu fiecare 7)=(7*7)*nr7(nr7-1)/2
//    z=k;
//    while(z>1 and fr[z]==fr[z-1])z--;
//    nr=k-z+1; //nr==nr7
//    sol=(((fr[k]%666013)*(fr[k]%666013))%666013*(nr*(nr-1)/2)%666013)%666013;
//  }
//  else   //fr[k]!=fr[k-1]   cazul 2 3 5 5 5 7  =>sol=5*7+5*7+5*7
//  {
//    z=k;
//    sol=fr[k]*fr[k-1];
//    z--;
//    while(z>1 and fr[z]==fr[z-1]){sol=sol%666013+(fr[k]*fr[z-1])%666013;z--;}
//  }
//  fo<<sol%666013<<endl;;
//
//  return 0;
//}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
////100p
//////// x*sx + y*sy =E-( t*st + z*sz  +ss)
//////generam un sir cu  elementele E-( t*st + z*sz  +ss)
////si cautam binar x*sx + y*sy
//#include <fstream>
//#include<cstring>
//#include <algorithm>
//#define M 100003
//using namespace std;
//ifstream fi("eq4.in");
//ofstream fo("eq4.out");
//char s[M],cifre[]="0123456789";
//long long  k,j,sol,el,ss,ok,i,m,sx,sy,sz,st,a,b,c,w,E,semn;
//long long v[1002003];
//int cauta_bin(long long x){//cauta pozitia cel mai mic el. mai mare ca x
//  int st,dr,mij;       //pozitia primului mai mare ca x!!!!
//  st=1;
//  dr=k+1;//pt. cazul cand caut el maxim
//  while(st<dr){
//    mij=(st+dr)/2;
//    if(x>=v[mij])st=mij+1;
//    else dr=mij;
//  }
//  return st;
//}
//int main()
//{
//  fi>>c;
//  fi.get();
//  fi.getline(s,M);
//  fi>>a>>b>>E;
//  strcat(s,"+");
//  m=strlen(s);
//  for(i=0;i<m;i++)
//    {
//        if(s[i]=='-' or s[i]=='+')
//        {
//            if(w!=0)ss+=semn*w;
//            w=0; //calcul coeficient in w
//            ok=0;//verif daca exista coef.
//            if(s[i]=='-')semn=-1;
//            if(s[i]=='+')semn=1;
//        }
//        else
//         if(strchr(cifre,s[i])>0){w=w*10+s[i]-'0';ok=1;}
//         else
//            {
//            if(ok==0)w=1;//cazul -x,  +y
//            if(s[i]=='x'){sx+=semn*w;w=0;}
//            if(s[i]=='y'){sy+=semn*w;w=0;}
//            if(s[i]=='z'){sz+=semn*w;w=0;}
//            if(s[i]=='t'){st+=semn*w;w=0;}
//           }
//    }
//  // fo<<sx<<" "<<sy<<" "<<sz<<" "<<st<<" "<<ss<<endl;;
//
//   if(c==1)fo<<sx+sy+sz+st+ss;
//   if(c==2)
//    {
//     for(i=a;i<=b;i++)
//      for(j=a;j<=b;j++)
//        v[++k]=E-ss-i*sz-j*st;
//     sort(v+1,v+k+1);
//     v[k+1]=v[k]+1;//!!!
//     //fo<<k<<" ";
//     for(i=a;i<=b;i++)
//      for(j=a;j<=b;j++)
//       {
//        el=i*sx+j*sy;
//        sol+=cauta_bin(el)-cauta_bin(el-1);
//       }
//    fo<<sol;
//    }
//   return 0;
//}
////65p  O(n3) brut force cu for-uri (dat calcul corect la  st===0!!!
////  t*st=E-(x*sx + y*sy + z*sz  +ss)
////avem x*sx + y*sy + z*sz + t*st +ss=E
//
//#include <fstream>
//#include<iostream>
//#include<cstring>
//#include <algorithm>
//#define M 100003
//using namespace std;
//ifstream fi("eq4.in");
//ofstream fo("eq4.out");
//char s[M],cifre[]="0123456789";
//long long  k,j,sol,el,ss,ok,i,m,sx,sy,sz,st,a,b,c,w,E,semn;
//int main()
//{
//  fi>>c;
//  fi.get();
//  fi.getline(s,M);
//  fi>>a>>b>>E;
//  strcat(s,"+");
//  m=strlen(s);
//  for(i=0;i<m;i++)
//    {
//        if(s[i]=='-' or s[i]=='+')
//        {
//            if(w!=0)ss+=semn*w;
//            w=0; //calcul coeficient in w
//            ok=0;//verif daca exista coef.
//            if(s[i]=='-')semn=-1;
//            if(s[i]=='+')semn=1;
//        }
//        else
//         if(strchr(cifre,s[i])>0){w=w*10+s[i]-'0';ok=1;}
//         else
//            {
//            if(ok==0)w=1;//cazul -x,  +y
//            if(s[i]=='x'){sx+=semn*w;w=0;}
//            if(s[i]=='y'){sy+=semn*w;w=0;}
//            if(s[i]=='z'){sz+=semn*w;w=0;}
//            if(s[i]=='t'){st+=semn*w;w=0;}
//           }
//    }
//   //fo<<sx<<" "<<sy<<" "<<sz<<" "<<st<<" "<<ss<<endl;;
//
//   if(c==1)fo<<sx+sy+sz+st+ss;
//   if(c==2)
//    {
//     //   x*sx + y*sy + z*sz + t*st +ss=E
//     //  t*st=E-(x*sx + y*sy + z*sz  +ss)
//     long long  termt;
//     for(i=a;i<=b;i++)
//      for(j=a;j<=b;j++)
//       for(k=a;k<=b;k++)
//        {  termt=E-(i*sx + j*sy + k*sz +ss);
//           if(st!=0)
//            {if(termt%st==0 and termt/st>=a and termt/st<=b)
//                 sol++;
//            }
//            else if(termt==0)sol+=(b-a+1);
//        }
//    fo<<sol;
//    }
//   return 0;
//}

/////40p  O(n3) brut force cu for-uri (dat calcul incorect la  st===0!!!
////  t*st=E-(x*sx + y*sy + z*sz  +ss)
////avem x*sx + y*sy + z*sz + t*st +ss=E
//avem x*sx + y*sy + z*sz + t*st +ss=E
//
//#include <fstream>
//#include<iostream>
//#include<cstring>
//#include <algorithm>
//#define M 100003
//using namespace std;
//ifstream fi("eq4.in");
//ofstream fo("eq4.out");
//char s[M],cifre[]="0123456789";
//long long  k,j,sol,el,ss,ok,i,m,sx,sy,sz,st,a,b,c,w,E,semn;
//int main()
//{
//  fi>>c;
//  fi.get();
//  fi.getline(s,M);
//  fi>>a>>b>>E;
//  strcat(s,"+");
//  m=strlen(s);
//  for(i=0;i<m;i++)
//    {
//        if(s[i]=='-' or s[i]=='+')
//        {
//            if(w!=0)ss+=semn*w;
//            w=0; //calcul coeficient in w
//            ok=0;//verif daca exista coef.
//            if(s[i]=='-')semn=-1;
//            if(s[i]=='+')semn=1;
//        }
//        else
//         if(strchr(cifre,s[i])>0){w=w*10+s[i]-'0';ok=1;}
//         else
//            {
//            if(ok==0)w=1;//cazul -x,  +y
//            if(s[i]=='x'){sx+=semn*w;w=0;}
//            if(s[i]=='y'){sy+=semn*w;w=0;}
//            if(s[i]=='z'){sz+=semn*w;w=0;}
//            if(s[i]=='t'){st+=semn*w;w=0;}
//           }
//    }
//  // fo<<sx<<" "<<sy<<" "<<sz<<" "<<st<<" "<<ss<<endl;;
//
//   if(c==1)fo<<sx+sy+sz+st+ss;
//   if(c==2)
//    {
//     long long  termt;
//     for(i=a;i<=b;i++)
//      for(j=a;j<=b;j++)
//       for(k=a;k<=b;k++)
//        {  termt=E-(i*sx + j*sy + k*sz +ss);
//           if(st!=0)
//            {if(termt%st==0 and termt/st>=a and termt/st<=b)
//                 sol++;
//            }
//            else sol++;//pr st==0 aici e gresala!!!!! =>40p
//        }
//    fo<<sol;
//    }
//   return 0;
//}
//var II vezi pbinfo
////80p timp depasit!!!!
////Lee cu  deque implementata dinamic cu pointeri
////cu matrice de ap[] sa nu pun de mai multe ori in coada
////merg  si pun zonele libere in fata
////dar le pun repetat de mai multe ori si timpul!!!

////var III vezi pbinfo
////65p timp depasit
////Lee cu coada implementata cu pointeri dinamic


////var IV
////60p creapa coada
////Lee dar creapa coada
//#include <fstream>
//#include <iomanip>
//#define M 503
//using namespace std;
//ifstream fi("rover.in");
//ofstream fo("rover.out");
//int a[M][M],b[M][M],c[10*M*M];
//int i,j,n,v,G;
//void Lee(int ii,int jj,int g){
//  int p,u,i,j,k;
//  p=u=1;
//  c[1]=ii*1000+jj;
//  b[ii][jj]=0;
//  while(p<=u){
//    i=c[p]/1000;
//    j=c[p]%1000;
//    p++;
//    if(i>1){   //N
//              if(a[i-1][j]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i-1][j])
//               {
//                    b[i-1][j]=b[i][j]+k;
//                    c[++u]=(i-1)*1000+j;
//               }
//           }
//    if(i<n){    //S
//              if(a[i+1][j]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i+1][j])
//               {
//                    b[i+1][j]=b[i][j]+k;
//                    c[++u]=(i+1)*1000+j;
//               }
//           }
//    if(j<n){   //E
//              if(a[i][j+1]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i][j+1])
//               {
//                    b[i][j+1]=b[i][j]+k;
//                    c[++u]=(i)*1000+(j+1);
//               }
//           }
//    if(j>1){   //V
//              if(a[i][j-1]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i][j-1])
//               {
//                    b[i][j-1]=b[i][j]+k;
//                    c[++u]=(i)*1000+(j-1);
//               }
//           }
//}
//}
//int main()
//{
//    fi>>v;
//    if(v==1){
//        fi>>n>>G;
//        for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)fi>>a[i][j];
//         //setare matrice b pe maxim
//         for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)b[i][j]=500000;
//         Lee(1,1,G);
//        // for(i=1;i<=n;i++){for(j=1;j<=n;j++)fo<<setw(3)<<b[i][j];fo<<endl;}
//         fo<<b[n][n];
//    }
//if(v==2){
//        fi>>n;
//        for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)fi>>a[i][j];
//         //cauta binar rezulatul - cea mai mica valoare buna!!!
//         int st,dr,mij;
//         st=0;dr=5000;
//         while(st<=dr){
//             mij=(st+dr)/2;
//               //setare matrice b pe maxim
//             for(i=1;i<=n;i++)
//              for(j=1;j<=n;j++)b[i][j]=500000;
//             Lee(1,1,mij);
//             if(b[n][n]>0)dr=mij-1;
//             else st=mij+1;
//         }
//         fo<<dr;
//    }
//   return 0;
//}
//
////75p timp depasit!!!!
////Lee cu  deque implementata dinamic cu pointeri
////cu matrice de ap[] sa nu pun de mai multe ori in coada
////merg  si pun zonele libere in fata
////
//#include <fstream>
//#include <iomanip>
//#define M 503
//using namespace std;
//ifstream fi("rover.in");
//ofstream fo("rover.out");
//struct nod{
// int i,j;
// nod*urm;
//}*p,*u;
//void push_bk(int i,int j,nod*&p,nod*&u){
//  nod*q=new nod;
//  q->i=i;
//  q->j=j;
//  q->urm=0;
//  if(p==0){p=q;u=q;}
//  else{
//      u->urm=q;
//      u=q;
//      }
//}
//void push_fr(int i,int j,nod*&p,nod*&u){
//  nod*q=new nod;
//  q->i=i;
//  q->j=j;
//  q->urm=0;
//  if(p==0){p=q;u=q;}
//  else{
//      q->urm=p;
//      p=q;
//      }
//}
//void pop(int &i,int &j,nod*&p,nod*&u){
//  nod*q;
//  i=p->i;
//  j=p->j;
//  q=p;
//  p=p->urm;
//  delete q;
//}
//int a[M][M],b[M][M],ap[M][M];
//int i,j,n,v,G;
//void Lee(int ii,int jj,int g){
//  int i,j,k;
//  p=0;//coada vida
//  push_bk(ii,jj,p,u);
//  b[ii][jj]=0;
//  ap[ii][jj]=1; //pun pe 1
//  while(p){
//    pop(i,j,p,u);
//    ap[i][j]=0; //pun pe 0
//    if(i>1){   //N
//              if(a[i-1][j]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i-1][j])
//               {
//                    b[i-1][j]=b[i][j]+k;
//                    if(b[i-1][j]==0) push_fr(i-1,j,p,u);
//                    else
//                    if(ap[i-1][j]==0) {push_bk(i-1,j,p,u);ap[i-1][j]=1;}
//               }
//           }
//    if(i<n){    //S
//              if(a[i+1][j]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i+1][j])
//               {
//                    b[i+1][j]=b[i][j]+k;
//                    if(b[i+1][j]==0) push_fr(i+1,j,p,u);
//                    else
//                    if(ap[i+1][j]==0) {push_bk(i+1,j,p,u);ap[i+1][j]=1;}
//               }
//           }
//    if(j<n){   //E
//              if(a[i][j+1]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i][j+1])
//               {
//                    b[i][j+1]=b[i][j]+k;
//                    if(b[i][j+1]==0) push_fr(i,j+1,p,u);
//                    else
//                        if(ap[i][j+1]==0) {push_bk(i,j+1,p,u);ap[i][j+1]=1;}
//               }
//           }
//    if(j>1){   //V
//              if(a[i][j-1]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i][j-1])
//               {
//                    b[i][j-1]=b[i][j]+k;
//                    if(b[i][j-1]==0) push_fr(i,j-1,p,u);
//                    else
//                        if(ap[i][j-1]==0) {push_bk(i,j-1,p,u);ap[i][j-1]=1;}
//               }
//           }
//}
//}
//int main()
//{
//    fi>>v;
//    if(v==1){
//        fi>>n>>G;
//        for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)fi>>a[i][j];
//         //setare matrice b pe maxim
//         for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)b[i][j]=500000;
//         Lee(1,1,G);
//        // for(i=1;i<=n;i++){for(j=1;j<=n;j++)fo<<setw(3)<<b[i][j];fo<<endl;}
//         fo<<b[n][n];
//    }
//if(v==2){
//        fi>>n;
//        for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)fi>>a[i][j];
//         //cauta binar rezulatul - cea mai mica valoare buna!!!
//         int st,dr,mij;
//         st=0;dr=5000;
//         while(st<=dr){
//             mij=(st+dr)/2;
//               //setare matrice b[][] pe maxim si ap[][] pe 0
//             for(i=1;i<=n;i++)
//              for(j=1;j<=n;j++)b[i][j]=500000;
//            for(i=1;i<=n;i++)
//              for(j=1;j<=n;j++)ap[i][j]=0;
//             Lee(1,1,mij);
//             if(b[n][n]>0)dr=mij-1;
//             else st=mij+1;
//         }
//         fo<<dr;
//    }
//   return 0;
//}

////p timp depasit!!!!
////Lee cu  deque implementata dinamic cu pointeri
////cu matrice de ap[] sa nu pun de mai multe ori in coada
////merg numai in zone sigure !!!
////la sf vad daca ating (n,n)
//#include <fstream>
//#include <iomanip>
//#define M 503
//using namespace std;
//ifstream fi("rover.in");
//ofstream fo("rover.out");
//struct nod{
// int i,j;
// nod*urm;
//}*p,*u;
//void push(int i,int j,nod*&p,nod*&u){
//  nod*q=new nod;
//  q->i=i;
//  q->j=j;
//  q->urm=0;
//  if(p==0){p=q;u=q;}
//  else{
//      u->urm=q;
//      u=q;
//      }
//}
//void pop(int &i,int &j,nod*&p,nod*&u){
//  nod*q;
//  i=p->i;
//  j=p->j;
//  q=p;
//  p=p->urm;
//  delete q;
//}
//int a[M][M],b[M][M],ap[M][M];
//int i,j,n,v,G;
//void Lee(int ii,int jj,int g){
//  int i,j,k;
//  p=0;//coada vida
//  push(ii,jj,p,u);
//  b[ii][jj]=0;
//  ap[ii][jj]=1; //pun pe 1
//  while(p){
//    pop(i,j,p,u);
//    ap[i][j]=0; //pun pe 0
//    if(i>1){   //N
//              if(a[i-1][j]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i-1][j])
//               {
//                    b[i-1][j]=b[i][j]+k;
//                    if(ap[i-1][j]==0){  //se pune in coada daca nu-i pus deja
//                           ap[i-1][j]=1;
//                           push(i-1,j,p,u);
//                    }
//               }
//           }
//    if(i<n){    //S
//              if(a[i+1][j]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i+1][j])
//               {
//                    b[i+1][j]=b[i][j]+k;
//                    if(ap[i+1][j]==0){  //se pune in coada daca nu-i pus deja
//                           ap[i+1][j]=1;
//                           push(i+1,j,p,u);
//                    }
//               }
//           }
//    if(j<n){   //E
//              if(a[i][j+1]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i][j+1])
//               {
//                    b[i][j+1]=b[i][j]+k;
//                    if(ap[i][j+1]==0){  //se pune in coada daca nu-i pus deja
//                           ap[i][j+1]=1;
//                           push(i,j+1,p,u);
//                   }
//               }
//           }
//    if(j>1){   //V
//              if(a[i][j-1]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i][j-1])
//               {
//                    b[i][j-1]=b[i][j]+k;
//                    if(ap[i][j-1]==0){  //se pune in coada daca nu-i pus deja
//                           ap[i][j-1]=1;
//                           push(i,j-1,p,u);
//                    }
//               }
//           }
//}
//}
//int main()
//{
//    fi>>v;
//    if(v==1){
//        fi>>n>>G;
//        for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)fi>>a[i][j];
//         //setare matrice b pe maxim
//         for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)b[i][j]=500000;
//         Lee(1,1,G);
//        // for(i=1;i<=n;i++){for(j=1;j<=n;j++)fo<<setw(3)<<b[i][j];fo<<endl;}
//         fo<<b[n][n];
//    }
//if(v==2){
//        fi>>n;
//        for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)fi>>a[i][j];
//         //cauta binar rezulatul - cea mai mica valoare buna!!!
//         int st,dr,mij;
//         st=0;dr=5000;
//         while(st<=dr){
//             mij=(st+dr)/2;
//               //setare matrice b[][] pe maxim si ap[][] pe 0
//             for(i=1;i<=n;i++)
//              for(j=1;j<=n;j++)b[i][j]=500000;
//            for(i=1;i<=n;i++)
//              for(j=1;j<=n;j++)ap[i][j]=0;
//             Lee(1,1,mij);
//             if(b[n][n]>0)dr=mij-1;
//             else st=mij+1;
//         }
//         fo<<dr;
//    }
//   return 0;
//}
////65p timp depasit!!!!
////Lee cu  coada implementata dinamic cu pointeri
////cu matrice de ap[] sa numpun de mai multe ori in coada
////dar se scoate si re repune de mai multe ori in coada!!!!
//#include <fstream>
//#include <iomanip>
//#define M 503
//using namespace std;
//ifstream fi("rover.in");
//ofstream fo("rover.out");
//struct nod{
// int i,j;
// nod*urm;
//}*p,*u;
//void push(int i,int j,nod*&p,nod*&u){
//  nod*q=new nod;
//  q->i=i;
//  q->j=j;
//  q->urm=0;
//  if(p==0){p=q;u=q;}
//  else{
//      u->urm=q;
//      u=q;
//      }
//}
//void pop(int &i,int &j,nod*&p,nod*&u){
//  nod*q;
//  i=p->i;
//  j=p->j;
//  q=p;
//  p=p->urm;
//  delete q;
//}
//int a[M][M],b[M][M],ap[M][M];
//int i,j,n,v,G;
//void Lee(int ii,int jj,int g){
//  int i,j,k;
//  p=0;//coada vida
//  push(ii,jj,p,u);
//  b[ii][jj]=0;
//  ap[ii][jj]=1; //pun pe 1
//  while(p){
//    pop(i,j,p,u);
//    ap[i][j]=0; //pun pe 0
//    if(i>1){   //N
//              if(a[i-1][j]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i-1][j])
//               {
//                    b[i-1][j]=b[i][j]+k;
//                    if(ap[i-1][j]==0){  //se pune in coada daca nu-i pus deja
//                           ap[i-1][j]=1;
//                           push(i-1,j,p,u);
//                    }
//               }
//           }
//    if(i<n){    //S
//              if(a[i+1][j]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i+1][j])
//               {
//                    b[i+1][j]=b[i][j]+k;
//                    if(ap[i+1][j]==0){  //se pune in coada daca nu-i pus deja
//                           ap[i+1][j]=1;
//                           push(i+1,j,p,u);
//                    }
//               }
//           }
//    if(j<n){   //E
//              if(a[i][j+1]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i][j+1])
//               {
//                    b[i][j+1]=b[i][j]+k;
//                    if(ap[i][j+1]==0){  //se pune in coada daca nu-i pus deja
//                           ap[i][j+1]=1;
//                           push(i,j+1,p,u);
//                   }
//               }
//           }
//    if(j>1){   //V
//              if(a[i][j-1]>=g)k=0;
//                else k=1;
//              if(b[i][j]+k<b[i][j-1])
//               {
//                    b[i][j-1]=b[i][j]+k;
//                    if(ap[i][j-1]==0){  //se pune in coada daca nu-i pus deja
//                           ap[i][j-1]=1;
//                           push(i,j-1,p,u);
//                    }
//               }
//           }
//}
//}
//int main()
//{
//    fi>>v;
//    if(v==1){
//        fi>>n>>G;
//        for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)fi>>a[i][j];
//         //setare matrice b pe maxim
//         for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)b[i][j]=500000;
//         Lee(1,1,G);
//        // for(i=1;i<=n;i++){for(j=1;j<=n;j++)fo<<setw(3)<<b[i][j];fo<<endl;}
//         fo<<b[n][n];
//    }
//if(v==2){
//        fi>>n;
//        for(i=1;i<=n;i++)
//         for(j=1;j<=n;j++)fi>>a[i][j];
//         //cauta binar rezulatul - cea mai mica valoare buna!!!
//         int st,dr,mij;
//         st=0;dr=5000;
//         while(st<=dr){
//             mij=(st+dr)/2;
//               //setare matrice b[][] pe maxim si ap[][] pe 0
//             for(i=1;i<=n;i++)
//              for(j=1;j<=n;j++)b[i][j]=500000;
//            for(i=1;i<=n;i++)
//              for(j=1;j<=n;j++)ap[i][j]=0;
//             Lee(1,1,mij);
//             if(b[n][n]>0)dr=mij-1;
//             else st=mij+1;
//         }
//         fo<<dr;
//    }
//   return 0;
//}
////70p O(n^3) brute force
////din fiecare punct calculez cu  while in stanga si dreapta
//#include <fstream>
//#define M 100003
//using namespace std;
//ifstream fi("turnuri.in");
//ofstream fo("turnuri.out");
//int a[M+1],b[M+1];
//int i,j,n,aux,s,p,q,frumusete;
//int main()
//{
//    fi>>n;
//    for(i=1;i<=n;i++)fi>>a[i];
//    for(i=1;i<=n;i++){
//        aux=a[i];//salvam a[i]
//        a[i]=0;
//        //calculam coef. de frumusete pt. a[i]=0
//        frumusete=0;
//        for(j=1;j<=n;j++)
//        {
//           //calcul spre stanga
//           p=j-1;
//           while(p>=1 and a[p]<a[j]) p--;
//           //calcul spre stanga
//           q=j+1;
//           while(q<=n and a[q]<a[j]) q++;
//           frumusete+=q-p-1;
//        }
//        b[i]=frumusete;
//        a[i]=aux;//refacem vectorul
//    }
//    for(i=1;i<=n;i++)fo<<b[i]<<'\n';
//   return 0;
//}
//
////3 varianta 100p, 65p, 40p
////100p
////avem x*sx + y*sy + z*sz + t*st +ss=E
////c1x + c2y =E-z*sz - t*st -ss
////idee fac un vector cu elementele membrului drept, apoi sortez
////     iau elementele membrului stang si le caut binar in vector
////     de cate ori apar adun la solutii
////caut cu caut_bin ce da poz urmatorului mai mare !!!!
//// si fac sol+=cauta_bin(el)-cauta_bin(el-1);  !!!!!!
//#include <fstream>
//#include<cstring>
//#include <algorithm>
//#define M 100003
//using namespace std;
//ifstream fi("eq4.in");
//ofstream fo("eq4.out");
//char s[M],cifre[]="0123456789";
//long long  k,j,sol,el,ss,ok,i,m,sx,sy,sz,st,a,b,c,w,E,semn;
//long long v[1002003];
//int cauta_bin(long long x){//cauta pozitia cel mai mic el. mai mare ca x
//  int st,dr,mij;       //pozitia primului mai mare ca x!!!!
//  v[k+1]=v[k]+1;//pt. cazul cand caut el maxim sau unul mai mare ca maxim
//  st=1;
//  dr=k+1;         //pt. cazul cand caut el maxim sau unul mai mare ca maxim
//  while(st<dr){
//    mij=(st+dr)/2;
//    if(x>=v[mij])st=mij+1;
//    else dr=mij;
//  }
//  return st;
//}
//int main()
//{
//  fi>>c;
//  fi.get();
//  fi.getline(s,M);
//  fi>>a>>b>>E;
//  strcat(s,"+");
//  m=strlen(s);
//  for(i=0;i<m;i++)
//    {
//        if(s[i]=='-' or s[i]=='+')
//        {
//            if(w!=0)ss+=semn*w;
//            w=0; //calcul coeficient in w
//            ok=0;//verif daca exista coef.
//            if(s[i]=='-')semn=-1;
//            if(s[i]=='+')semn=1;
//        }
//        else
//         if(strchr(cifre,s[i])>0){w=w*10+s[i]-'0';ok=1;}
//         else
//            {
//            if(ok==0)w=1;//cazul -x,  +y
//            if(s[i]=='x'){sx+=semn*w;w=0;}
//            if(s[i]=='y'){sy+=semn*w;w=0;}
//            if(s[i]=='z'){sz+=semn*w;w=0;}
//            if(s[i]=='t'){st+=semn*w;w=0;}
//           }
//    }
//  // fo<<sx<<" "<<sy<<" "<<sz<<" "<<st<<" "<<ss<<endl;;
//
//   if(c==1)fo<<sx+sy+sz+st+ss;
//   if(c==2)
//    {
//     for(i=a;i<=b;i++)
//      for(j=a;j<=b;j++)
//        v[++k]=E-ss-i*sz-j*st;
//     sort(v+1,v+k+1);
//     for(i=a;i<=b;i++)
//      for(j=a;j<=b;j++)
//       {
//        el=i*sx+j*sy;
//        sol+=cauta_bin(el)-cauta_bin(el-1);
//       }
//    fo<<sol;
//    }
//   return 0;
//}
////40p cu brute force (4 for) dar cu greseala  de impartire la 0
////avem x*sx + y*sy + z*sz + t*st +ss=E
//
//#include <fstream>
//#include<iostream>
//#include<cstring>
//#include <algorithm>
//#define M 100003
//using namespace std;
//ifstream fi("eq4.in");
//ofstream fo("eq4.out");
//char s[M],cifre[]="0123456789";
//long long  k,j,sol,el,ss,ok,i,m,sx,sy,sz,st,a,b,c,w,E,semn;
//int main()
//{
//  fi>>c;
//  fi.get();
//  fi.getline(s,M);
//  fi>>a>>b>>E;
//  strcat(s,"+");
//  m=strlen(s);
//  for(i=0;i<m;i++)
//    {
//        if(s[i]=='-' or s[i]=='+')
//        {
//            if(w!=0)ss+=semn*w;
//            w=0; //calcul coeficient in w
//            ok=0;//verif daca exista coef.
//            if(s[i]=='-')semn=-1;
//            if(s[i]=='+')semn=1;
//        }
//        else
//         if(strchr(cifre,s[i])>0){w=w*10+s[i]-'0';ok=1;}
//         else
//            {
//            if(ok==0)w=1;//cazul -x,  +y
//            if(s[i]=='x'){sx+=semn*w;w=0;}
//            if(s[i]=='y'){sy+=semn*w;w=0;}
//            if(s[i]=='z'){sz+=semn*w;w=0;}
//            if(s[i]=='t'){st+=semn*w;w=0;}
//           }
//    }
//  // fo<<sx<<" "<<sy<<" "<<sz<<" "<<st<<" "<<ss<<endl;;
//
//   if(c==1)fo<<sx+sy+sz+st+ss;
//   if(c==2)
//    {
//     long long  termt;
//     for(i=a;i<=b;i++)
//      for(j=a;j<=b;j++)
//       for(k=a;k<=b;k++)
//        {  termt=E-(i*sx + j*sy + k*sz +ss);
//           if(st!=0)  //impartire la 0!!!! primesti doar 40p
//            {if(termt%st==0 and termt/st>=a and termt/st<=b)
//                 sol++;
//            }
//            else sol++;
//        }
//    fo<<sol;
//    }
//   return 0;
//}
////65p  cu brute force (4 for)
////avem x*sx + y*sy + z*sz + t*st +ss=E
//
//#include <fstream>
//#include<iostream>
//#include<cstring>
//#include <algorithm>
//#define M 100003
//using namespace std;
//ifstream fi("eq4.in");
//ofstream fo("eq4.out");
//char s[M],cifre[]="0123456789";
//long long  k,j,sol,el,ss,ok,i,m,sx,sy,sz,st,a,b,c,w,E,semn;
//int main()
//{
//  fi>>c;
//  fi.get();
//  fi.getline(s,M);
//  fi>>a>>b>>E;
//  strcat(s,"+");
//  m=strlen(s);
//  for(i=0;i<m;i++)
//    {
//        if(s[i]=='-' or s[i]=='+')
//        {
//            if(w!=0)ss+=semn*w;
//            w=0; //calcul coeficient in w
//            ok=0;//verif daca exista coef.
//            if(s[i]=='-')semn=-1;
//            if(s[i]=='+')semn=1;
//        }
//        else
//         if(strchr(cifre,s[i])>0){w=w*10+s[i]-'0';ok=1;}
//         else
//            {
//            if(ok==0)w=1;//cazul -x,  +y
//            if(s[i]=='x'){sx+=semn*w;w=0;}
//            if(s[i]=='y'){sy+=semn*w;w=0;}
//            if(s[i]=='z'){sz+=semn*w;w=0;}
//            if(s[i]=='t'){st+=semn*w;w=0;}
//           }
//    }
//   //fo<<sx<<" "<<sy<<" "<<sz<<" "<<st<<" "<<ss<<endl;;
//
//   if(c==1)fo<<sx+sy+sz+st+ss;
//   if(c==2)
//    {
//     //   x*sx + y*sy + z*sz + t*st +ss=E
//     //  t*st=E-(x*sx + y*sy + z*sz  +ss)
//     long long  termt;
//     for(i=a;i<=b;i++)
//      for(j=a;j<=b;j++)
//       for(k=a;k<=b;k++)
//        {  termt=E-(i*sx + j*sy + k*sz +ss);
//           if(st!=0) //imp. la 0  !!!! 40p fara faza asta
//            {if(termt%st==0 and termt/st>=a and termt/st<=b)
//                 sol++;
//            }
//            else if(termt==0)sol+=(b-a+1);//!!! t*0==0 => orice t este bun
//        }
//    fo<<sol;
//    }
//   return 0;
//}
////100p
////avem x*sx + y*sy + z*sz + t*st +ss=E
////c1x + c2y =E-z*sz - t*st -ss
////idee fac un vector cu elementele membrului drept, apoi sortez
////     iau elementele membrului stang si le caut binar in vector
////     de cate ori apar adun la solutii
////caut cu caut_bin ce da poz urmatorului mai mare !!!!
//// si fac sol+=cauta_bin(el)-cauta_bin(el-1);  !!!!!!
//#include <fstream>
//#include<cstring>
//#include <algorithm>
//#define M 100003
//using namespace std;
//ifstream fi("eq4.in");
//ofstream fo("eq4.out");
//char s[M],cifre[]="0123456789";
//long long  k,j,sol,el,ss,ok,i,m,sx,sy,sz,st,a,b,c,w,E,semn;
//long long v[1002003];
//int cauta_bin(long long x){//cauta pozitia cel mai mic el. mai mare ca x
//  int st,dr,mij;       //pozitia primului mai mare ca x!!!!
//  v[k+1]=v[k]+1;//pt. cazul cand caut el maxim sau unul mai mare ca maxim
//  st=1;
//  dr=k+1;         //pt. cazul cand caut el maxim sau unul mai mare ca maxim
//  while(st<dr){
//    mij=(st+dr)/2;
//    if(x>=v[mij])st=mij+1;
//    else dr=mij;
//  }
//  return st;
//}
//int main()
//{
//  fi>>c;
//  fi.get();
//  fi.getline(s,M);
//  fi>>a>>b>>E;
//  strcat(s,"+");
//  m=strlen(s);
//  for(i=0;i<m;i++)
//    {
//        if(s[i]=='-' or s[i]=='+')
//        {
//            if(w!=0)ss+=semn*w;
//            w=0; //calcul coeficient in w
//            ok=0;//verif daca exista coef.
//            if(s[i]=='-')semn=-1;
//            if(s[i]=='+')semn=1;
//        }
//        else
//         if(strchr(cifre,s[i])>0){w=w*10+s[i]-'0';ok=1;}
//         else
//            {
//            if(ok==0)w=1;//cazul -x,  +y
//            if(s[i]=='x'){sx+=semn*w;w=0;}
//            if(s[i]=='y'){sy+=semn*w;w=0;}
//            if(s[i]=='z'){sz+=semn*w;w=0;}
//            if(s[i]=='t'){st+=semn*w;w=0;}
//           }
//    }
//  // fo<<sx<<" "<<sy<<" "<<sz<<" "<<st<<" "<<ss<<endl;;
//
//   if(c==1)fo<<sx+sy+sz+st+ss;
//   if(c==2)
//    {
//     for(i=a;i<=b;i++)
//      for(j=a;j<=b;j++)
//        v[++k]=E-ss-i*sz-j*st;
//     sort(v+1,v+k+1);
//     for(i=a;i<=b;i++)
//      for(j=a;j<=b;j++)
//       {
//        el=i*sx+j*sy;
//        sol+=cauta_bin(el)-cauta_bin(el-1);
//       }
//    fo<<sol;
//    }
//   return 0;
//}
//#include <fstream>
//#include <iomanip>
//#define M 1000002
//using namespace std;
//ifstream fi("a.in");
//ofstream fo("a.out");
//int a[M],pr[M],b[M],c[M],i,n,k1,k0,m,maxi,k,j;
//int main()
//{
//    //Ciur  numerele prime au pr[]==0
//    k=M-2;
//    pr[0]=pr[1]=1;//neprime
//    for(i=2; i<=k; i++)
//        if(pr[i]==0)
//            for(j=2*i; j<=k; j=j+i)pr[j]=1;
//    //
//    fi>>n;
//    for(i=1; i<=n; i++)fi>>a[i];
//    for(i=1; i<=n; i++)
//        if(a[i]%9==0)a[i]=9;        //9 pt. numar div cu 9
//        else if(pr[a[i]]==0)a[i]=1;  //1 pt. numar prim
//        else a[i]=0;            //0 pt. numar oarecare
//    //a)
//    for(i=1; i<=n; i++)
//        if(a[i]==9 )k0++;
//    fo<<k0<<endl;
//    //b)
//    for(i=2; i<n; i++)
//        if(a[i]==9 and a[i-1]==1 and a[i+1]==1)k1++;
//    fo<<k1<<endl;
//    //c)
//    //precalc. in b[i-1] cate elem consecutive din stanga sunt prime
//    for(i=1; i<=n; i++) // ----->>>>>
//        if(a[i]==1)b[i]=1+b[i-1];
//        else b[i]=0;
//    //precalc. in c[i+1] cate elem consecutive din dreapta sunt prime
//    for(i=n; i>=1; i--) // <<<<<<-----
//        if(a[i]==1)c[i]=1+c[i+1];
//        else c[i]=0;
//    for(i=1; i<=n; i++)
//        if(a[i]==9)
//        {
//            m=min(b[i-1],c[i+1]);
//            maxi=max(m,maxi);
//        }
//    fo<<maxi<<endl;;
//    //
////    for(i=1; i<=n; i++)fo<<setw(3)<<a[i];   fo<<endl;
////    for(i=1; i<=n; i++)fo<<setw(3)<<b[i];   fo<<endl;
////    for(i=1; i<=n; i++)fo<<setw(3)<<c[i];   fo<<endl;
//    return 0;
//}
//// (Lee cu o coada statica(vector) smechera!!!! i*1000+j !!!)+vector de directii
////punem initial in coada linia 1
//#include <fstream>
//#include<iomanip>
//#define M 1003
//using namespace std;
//ifstream fi("prosir.in");
//ofstream fo("prosir.out");
//int a[M][M],xx,yy,n,m,i,j,z,w,k,p,u;
//int c[M*M],x,d,ii,jj,mini;
//int diri[]= {0,-1,0,1, 0}; //N E S V
//int dirj[]= {0, 0,1,0,-1};
//int main()
//{
//    fi>>m>>n;
//    for(i=1;i<=m;i++)
//        for(j=1;j<=n;j++) fi>>a[i][j];
//    for(j=0; j<=n+1; j++)  //operatia de bordare
//        {a[0][j]=1; a[m+1][j]=1;}
//    for(i=0; i<=m+1; i++)
//        {a[i][0]=1; a[i][n+1]=1;}
//    p=1;
//    for(j=1;j<=n;j++)  //se pun in coada el. de pe linia 1
//     if(a[1][j]==0) {a[1][j]=2;c[++u]=1*10000+j;}
//    while(p<=u)  //cat timp sunt elemente in coada
//    {
//        x=c[p];//se ia element din coada x-punct curent
//        p++;   //se avanseaza in coada
//        i=x/10000; j=x%10000; //se afla i,j pentru punctul curent
//        for(d=1; d<=4; d++)  //merg pe cele 4 directii
//        {
//            ii=i+diri[d];  //afla noul punct dupa deplasarea N E S V
//            jj=j+dirj[d];
//            if(a[ii][jj]==0) //daca noul punct nu este vizitat
//            {
//                a[ii][jj]=a[i][j]+1;  //se marcheaza noul punct
//                u++; c[u]=ii*10000+jj; //se pune in  coada noul punct
//            }
//        }
//    }
//   mini=1000000;
//   for(j=1;j<=n;j++)
//    if(a[m][j]!=0 and a[m][j]!=1 and a[m][j]<mini)mini=a[m][j];
//   fo<<mini-1<<endl;
////    for(i=0;i<=m+1;i++){
////     for(j=0;j<=n+1;j++)
////       fo<<setw(3)<<a[i][j];
////     fo<<'\n';
////     }
//    return 0;
//}

//// (Lee  Palat
//#include <fstream>
//#include<iomanip>
//#define M 1003
//using namespace std;
//ifstream fi("prosir.in");
//ofstream fo("prosir.out");
//char ch;
//int a[M][M],c[M*M],b[M][M];
//int d,p,u,ii,jj,x,i,j,n,m,iL,jL,isol,jsol,mini;
//int diri[]={0,-1,0,1, 0};//N E S V
//int dirj[]={0, 0,1,0,-1};
//int main()
//{
//    fi>>n>>m;
//    for(i=1;i<=n;i++)
//    for(j=1;j<=m;j++){fi>>ch;
//                      //if(c=='_')a[i][j]=0;
//                      if(ch=='Z')a[i][j]=-1;
//                      if(ch=='I'){iL=i;jL=j;}
//                      if(ch=='F')b[i][j]=1; //matricae cu Fetii Frumosi
//                      }
//    //bordarea
//    for(i=0;i<=n+1;i++)a[i][0]=a[i][m+1]=-1;
//    for(j=0;j<=m+1;j++)a[0][j]=a[n+1][j]=-1;
//
//    //Lee facut de la Ileana
//    p=1;
//    a[iL][jL]=1;
//    c[++u]=iL*10000+jL;
//    while(p<=u){
//        x=c[p];
//        p++;
//        i=x/10000;
//        j=x%10000;
//        for(d=1;d<=4;d++){
//            ii=i+diri[d];
//            jj=j+dirj[d];
//            if(a[ii][jj]==0){
//               a[ii][jj]=a[i][j]+1;
//               c[++u]=ii*10000+jj;
//            }
//        }
//    }
//    mini=10000000;
//    for(i=1;i<=n;i++)
//    for(j=1;j<=m;j++)
//        if(b[i][j]==1 and a[i][j]!=0 and a[i][j]<mini)
//            mini=a[i][j];
//    for(i=1;i<=n;i++)
//    for(j=1;j<=m;j++)
//        if(b[i][j]==1 and a[i][j]!=0 and a[i][j]==mini)
//            {
//                isol=i;jsol=j;
//            }
//    fo<<isol<<" "<<jsol<<endl;
////    for(i=1;i<=n;i++){
////     for(j=1;j<=m;j++)
////        fo<<setw(3)<<a[i][j];
////    fo<<endl;
////    }
//    return 0;
//}
//// (Lee
//#include <fstream>
//#include<iomanip>
//#define M 1003
//using namespace std;
//ifstream fi("acces1.in");
//ofstream fo("acces1.out");
//char ch;
//int a[M][M],c[M*M];
//int d,p,u,ii,jj,x,i,j,n,m,ib,is,jb,js;
//int diri[]={0,-1,0,1, 0};//N E S V
//int dirj[]={0, 0,1,0,-1};
//int main()
//{
//    fi>>n>>m;
//    for(i=1;i<=n;i++)
//    for(j=1;j<=m;j++){fi>>ch;
//                      //if(c=='_')a[i][j]=0;
//                      if(ch=='#')a[i][j]=-1;
//                      if(ch=='P') //punem pompierii initial in coada
//                          {a[i][j]=1;
//                           c[++u]=i*10000+j;
//                          }
//                      }
//    //bordarea
//    for(i=0;i<=n+1;i++)a[i][0]=a[i][m+1]=-1;
//    for(j=0;j<=m+1;j++)a[0][j]=a[n+1][j]=-1;
//
//    //Lee facut de la branza la soarece
//    p=1;
//    while(p<=u){
//        x=c[p];
//        p++;
//        i=x/10000;
//        j=x%10000;
//        for(d=1;d<=4;d++){
//            ii=i+diri[d];
//            jj=j+dirj[d];
//            if(a[ii][jj]==0){
//               a[ii][jj]=a[i][j]+1;
//               c[++u]=ii*10000+jj;
//            }
//        }
//    }
//
//    for(i=1;i<=n;i++){
//    for(j=1;j<=m;j++)
//        if(a[i][j]==-1)fo<<"# ";
//        else if(a[i][j]==0)fo<<"- ";
//             else fo<<a[i][j]-1<<" ";
//    fo<<endl;
//    }
//    return 0;
//}
////coada1 ??!!
//    #include <fstream>
//    #include<cstring>
//    using namespace std;
//    ifstream fi("prosir.in");
//    ofstream fo("prosir.out");
//    int n,i,k,j,m;
//    int z,x,st[50003],a[50003],poz[1003];
//    char s[10];
//    int main()
//    {
//        fi>>m;
//        for(i=1;i<=m;i++){
//            fi>>s>>x;
//            if(strcmp(s,"push")==0)
//               {
//                   if(poz[x]>0)z=poz[x];
//                   st[++k]=x;poz[x]=k;
//              }
//            else
//                if(poz[x]<=z)fo<<-1<<'\n';//!!
//                else fo<<poz[x]-z<<'\n';
//        }
//        return 0;
//    }
//#include <iostream>
//#include<cstring>
//using namespace std;
//int n,i,k,j,m;
//char st[1000003],a[1000003];
//int main()
//{
//    cin>>k>>a;
//    n=strlen(a);
//    m=1;
//    st[m]=a[0];  //pun primul element in stiva
//    for(i=1;i<n;i++)
//    if(k>0)  //daca nu am eliminat inca k elemente
//        {
//            st[++m]=a[i];  //pun a[i] in stiva
//            while(m>1 and st[m]<st[m-1] and k>0)  //scot din stiva toate elementele
//                {st[m-1]=st[m];m--;k--;}          //mai mici ca a[i]
//        }
//     else    st[++m]=a[i];//am eliminat deja k elemente
//
//    for(i=1;i<=m-k;i++)cout<<st[i]; //m-k !!! 3 abcde =>ab (ultimele !!)
//    return 0;
//}
//#include<iostream>
//#include<fstream>
//#include<cmath>
//#include<iomanip>
//# define M 303
//using namespace std;
//ifstream fi("prosir.in");
//ofstream fo("prosir.out");
//int i,j,n,m,P[M],k,p,x;
//int main()
//{
//   fi>>m>>n>>p;
//   for(j=1;j<=n;j++)P[j]=1;
//   for(i=1;i<=m;i++)
//   for(j=1;j<=n;j++){
//      fi>>x;
//      P[j]=(P[j]*x)%p;
//   }
//   for(j=1;j<=n;j++)
//    if(P[j]%p==0)k++;
//   fo<<k;
//    return 0;
//}
//forma de  a X b
//sol=(cmmmc/a-1) + (cmmmc/b-1)
//(numar de reflexii pe peretii exteriori)+(numar de reflexii pe peretii interiori)
//#include<fstream>
//#include<iostream>
//#include<cstring>
//using namespace std;
//int i,n,k;
//char li[200],Li[200],ch;
//char rot13(int c)
//{
//  if(c>='a' and c<='z')return li[27+(c-'a')-13];
//  if(c>='A' and c<='Z')return Li[27+(c-'A')-13];
//  c=' ';
//  return c;
//}
//int main()
//{
//    k=0;
//    for(char i='a'; i<='z'; i++)li[++k]=i;
//    for(char i='a'; i<='z'; i++)li[++k]=i;
//    k=0;
//    for(char i='A'; i<='Z'; i++)Li[++k]=i;
//    for(char i='A'; i<='Z'; i++)Li[++k]=i;
//    while(ch=cin.get()){
//      if(ch==13)break;
//      cout<<rot13(ch);
//    }
//    return 0;
//}
//


//#include<iostream>
//#include<fstream>
//#include<cstring>
//# define M 1003
//using namespace std;
//ifstream fi("subsircomunmaximal.in");
//ofstream fo("subsircomunmaximal.out");
//int a[M][M];
//int i,j,n,m,k;
//char s[M],t[M],sol[M];
//int main()
//{
//    fi.getline(s,M);
//    fi.getline(t,M);
//    n=strlen(s);
//    m=strlen(t);
//    for(i=1;i<=n;i++)
//        for(j=1;j<=m;j++)
//            if(s[i-1]==t[j-1])a[i][j]=1+a[i-1][j-1];
//            else a[i][j]=max(a[i-1][j],a[i][j-1]);
//    i=n;j=m;
//    while(i>=1 and j>=1)
//    {
//        if(s[i-1]==t[j-1]){sol[++k]=s[i-1];i--;j--;}
//        else
//            if(a[i][j-1]==a[i][j])j--;
//            else i--;
//    }
//    for(i=k;i>=1;i--)fo<<sol[i];
////    fo<<endl;
////    for(i=1;i<=n;i++){
////        for(j=1;j<=m;j++)fo<<a[i][j]<<" ";
////        fo<<endl;
////    }
//    return 0;
//}
//#include<iostream>
//#include<fstream>
//#include<cstring>
//# define M 1003
//using namespace std;
//ifstream fi("lungimesubsircomunmaximal.in");
//ofstream fo("lungimesubsircomunmaximal.out");
//int a[M][M];
//int i,j,n,m;
//char s[M],t[M];
//int main()
//{
//    fi.getline(s,M);
//    fi.getline(t,M);
//    n=strlen(s);
//    m=strlen(t);
//    for(i=1;i<=n;i++)
//        for(j=1;j<=m;j++)
//            if(s[i-1]==t[j-1])a[i][j]=1+a[i-1][j-1];
//            else a[i][j]=max(a[i-1][j],a[i][j-1]);
//    fo<<a[n][m];
//    return 0;
//}
//#include<iostream>
//#include<fstream>
//#include<cstring>
//# define M 1003
//using namespace std;
//ifstream fi("prosir.in");
//ofstream fo("prosir.out");
//int a[M][M];
//int i,j,n,m,k;
//char s[M],t[M],sol[M];
//int main()
//{
//    fi.getline(s,M);
//    fi.getline(t,M);
//    n=strlen(s);
//    m=strlen(t);
//    for(i=1;i<=n;i++)
//        for(j=1;j<=m;j++)
//            if(s[i-1]==t[j-1])a[i][j]=1+a[i-1][j-1];
//            else a[i][j]=max(a[i-1][j],a[i][j-1]);
//    i=n;j=m;
//    while(i>=1 and j>=1)
//    {
//        if(s[i-1]==t[j-1]){sol[++k]=s[i-1];i--;j--;}
//        else
//            if(a[i][j-1]==a[i][j])j--;
//            else i--;
//    }
//    for(i=k;i>=1;i--)fo<<sol[i];
////    fo<<endl;
////    for(i=1;i<=n;i++){
////        for(j=1;j<=m;j++)fo<<a[i][j]<<" ";
////        fo<<endl;
////    }
//    return 0;
//}
////var II 55p
////timpul: am copiat la fiecare sol posibila in t si
////apoi am comparat cu sol!!!
////idee
////solutia incepe cu litera cea mai mica
////dddddddr se incearca doar primul d (restul nu are rost)
////ddddddda nu se poate deoarece sol ar fi adddddddd!!!
////la fiecare d gasit(d de la inceput)cmpar cu sol si schimb sol daca trebuie
//#include<iostream>
//#include<cstring>
//#include<fstream>
//# define M 200005
//using namespace std;
//ifstream fi("minlex.in");
//ofstream fo("minlex.out");
//char cmin,s[M],*p,t[M],z[M],sol[M];
//int i,n,rot,j,k;
//int main()
//{
//    fi.get(s,M);
//    n=strlen(s);
//    strcpy(t,s);
//    strcat(s,t);
//    cmin=126;
//    for(i=0; i<n; i++)
//        if(s[i]<cmin)cmin=s[i];
//    //primul cuv e pus in sol !!!
//    p=strchr(s,cmin);
//    strncat(sol,p,n);
//    rot=p-s;
//    for(i=1; i<n; i++)
//        if(s[i]==cmin and s[i]!=s[i-1])
//        {
//            t[0]=0;
//            strncat(t,s+i,n);
//            if(strcmp(t,sol)<0)
//                        {strcpy(sol,t);rot=i;}
//
//        }
//    fo<<rot;
//    return 0;
//}
////var I 55p timpul!!
////idee rudimentara
////extrag fiecare subsir si compar cu sol
//#include<iostream>
//#include<cstring>
//#include<fstream>
//# define M 200005
//using namespace std;
//ifstream fi("minlex.in");
//ofstream fo("minlex.out");
//char s[M],*p,t[M],z[M],sol[M];
//int i,n,poz;
//int main()
//{
//    fi.get(s,M);
//    strcpy(sol,s);
//    n=strlen(s);
//    strcpy(t,s);
//    strcat(s,t);
//    for(i=0;i<n;i++)
//    {
//      z[0]='\0';
//      strncat(z,s+i,n);
//     // fo<<z<<endl;
//      if(strcmp(sol,z)>0){strcpy(sol,z);poz=i;}
//    }
//    fo<<poz;
//    return 0;
//}
//#include<fstream>
//using namespace std;
//ifstream fi("a.in");
//ofstream fo("a.out");
//int n,m,i,p,maxi,anterior,j,x,y,t;
//int a[1003],L[1003],s[1003],sfin[1003];
//bool prim(int x){
//int d;
//if(x==0 or x==1 )return false;
//for(d=2;d*d<=x;d++)
//    if(x%d==0)return false;
//return true;
//}
////void afis_sol1(int i,int k){//afis toate sol pornind din p
////int j;
////s[k]=a[i];
////if(k==maxi){
////        for(t=1;t<=k;t++)fo<<s[t]<<" ";fo<<endl;
////        }
////else {
////     for(j=i+1;j<=m;j++)
////       if(a[i]<=a[j] and L[i]==L[j]+1)
////             afis_sol(j,k+1);
////     }
////}
//void afis_sol(int i,int k){
//int j;
//s[k]=a[i];
//if(k==maxi){
//        t=1;
//        while(t<=k and s[t]==sfin[t])t++;
//         if(t!=k+1 and s[t]<sfin[t])
//            for(t=1;t<=k;t++)sfin[t]=s[t];
//        }
//else {
//     for(j=i+1;j<=m;j++)
//       if(a[i]<=a[j] and L[i]==L[j]+1)
//             afis_sol(j,k+1);
//     }
//}
//int main()
//{
//  fi>>n;
//  for(i=1;i<=n;i++){
//          fi>>x;
//          if(prim(x))a[++m]=x;
//          }
//  for(i=m;i>=1;i--)
//     { maxi=0;
//       for(j=i+1;j<=m;j++)
//        if((a[i]<=a[j])&&(maxi<L[j]))
//             maxi=L[j];
//       L[i]=maxi+1;
//      }
//  maxi=L[1];
//  for(i=1;i<=m;i++)
//     if(L[i]>maxi)  maxi=L[i];
////for(i=1;i<=m;i++)fo<<a[i]<<" ";fo<<endl;
////for(i=1;i<=m;i++)fo<<L[i]<<" ";fo<<endl;
//for(int t=1;t<=maxi;t++) sfin[t]=2000000000;
//for(i=1;i<=m;i++)
//    if(L[i]==maxi)afis_sol(i,1);
// fo<<maxi<<endl;
// for(int t=1;t<=maxi;t++) fo<<sfin[t]<<" ";
// return 0;
//}

//#include<fstream>
//# define M 203
//#include<iomanip>
//using namespace std;
//ifstream fi("prosir.in");
//ofstream fo("prosir.out");
//int  n,i,j,maxi,d,m,S;
//int a[M][M],s[M][M];
//int main()
//{
//  fi>>n>>m;
//  for(i=0;i<=n+1;i++)
//    for(j=0;j<=m+1;j++) s[i][j]=2000000000;
//  for(i=1;i<=n;i++)
//    for(j=1;j<=m;j++)
//       fi>>a[i][j];
//
//  //calcul matrice
//  for(i=1;i<=n;i++)
//       s[i][m]=a[i][m];
//  for(j=m-1;j>=1;j--)
//     for(i=1;i<=n;i++)
//         s[i][j]=a[i][j]+min(s[i-1][j+1],min(s[i][j+1],s[i+1][j+1]));
////for(i=0;i<=n+1;i++){for(j=0;j<=m+1;j++)fo<<setw(2)<<a[i][j]<<" ";fo<<endl;}
////for(i=1;i<=n;i++){for(j=1;j<=m;j++)fo<<setw(2)<<s[i][j]<<" ";fo<<endl;}
// //calcul solutie
// int mini=2000000000;
// for(i=1;i<=n;i++)
//   mini=min(mini,s[i][1]);
//  fo<<mini<<'\n';
// return 0;
//}

//https://www.pbinfo.ro/?pagina=profil&user=DinuDamsa
//#include<iostream>
//using namespace std;
//int n,r,b;
//int main(){
//  cin>>n>>b;
//  r=n&(1<<b);
//  cout<<r;
//return 0;
//}
//#include<iostream>
//#include <fstream>
//#include<cstring>
//# define M 256
////#define fi cin
////#define fo cout
//using namespace std;
//ifstream fi("prosir.in");
//ofstream fo("prosir.out");
//int i,n,maxi,k,j;
//char s[M],*p,c1[M],c2[M],c[M][M];
//int main(){
//  while(fi>>s){
//    strcpy(c[++k],s);
//  }
//  for(i=1;i<=k;i++)
//    for(j=i+1;j<=k;j++)
//      if(strcmp(c[i],c[j])>0)swap(c[i],c[j]);
//  for(i=1;i<=k;i++)fo<<c[i]<<'\n';
//return 0;
//}
//#include<iostream>
//#include<cstring>
//#define M 300
//using namespace std;
//char s[M],Litere[M],t[M];
//int i,n,j,k,z;
//bool litera(char x){
// if((x>='a' and x<='z')or
//      (x>='A' and x<='Z'))return true;
//    else return false;
// }
//int main()
//{
//    cin.get(s,300);
//    n=strlen(s);
//    for(i=0;i<n;i++)
//        if(litera(s[i]))t[k++]=s[i];
//    cout<<t;
//    return 0;
//}

////40p timpul
//#include <iostream>
//#include<fstream>
//# define M 10000
//#define fi cin
//#define fo cout
//using namespace std;
////ifstream fi("arme.in");
////ofstream fo("arme.out");
//int pr[40003];
//int p,x,y,d,c,MM,kk,j;
//int  A[M], B[M], C[M],i,na,nb,nc,n;
//int SOL[M], SOLF1[M], SOLF2[M],nsol,nsolf1,nsolf2;
//int S[M],ns,R[M],nr,P[M],np,R1[M],nr1,DEL[M],ndel,RR[M],nrr;
////pune pe 0 tot vectorul si na  pe 0
//void seteaza0(int A[M],int na){
//int i,n;
//na=0;
//n=M-1;
//for(i=0;i<=n;i++)A[i]=0;
//}
//void afiseaza(int A[M],int na){
//int i;
//for(i=1;i<=na;i++)fo<<A[i];fo<<" ";
//fo<<endl;
//}
////copiaza vectorul A in B
//void copiaza(int A[M],int na,int B[M],int &nb){
//int i;
//seteaza0(B,nb);
//nb=na;
//for(i=1;i<=na;i++)B[i]=A[i];
//}
////inverseaza vector A
//void inverseaza(int A[M],int na){
//int i,mij=na/2;
//for(i=1;i<=mij;i++)
//    swap(A[i],A[na-i+1]);
//}
//
////C=A*B  cu multe cifre fiecare
//void inmulteste(int A[M],int na,int B[M],int nb,int C[M],int &nc){
//int transport,i,x,j,AA[M],BB[M],naa,nbb;
//seteaza0(AA,naa);
//seteaza0(BB,nbb);
//seteaza0(C,nc);
//copiaza(A,na,AA,naa);
//copiaza(B,nb,BB,nbb);
//inverseaza(AA,naa);
//inverseaza(BB,nbb);
//for(i=1;i<=na;i++)
//    for(j=1;j<=nb;j++)
//        C[i+j-1]+=AA[i]*BB[j];
//nc=naa+nbb-1;
//transport=0;
//for(i=1;i<=nc;i++){
// x=transport+C[i];
// C[i]=x%10;
// transport=x/10;
// }
//if(transport>0)C[++nc]=transport;
//inverseaza(C,nc);
//}
//
//
//int main(){
//    //ciur pana la 40000
//MM=40000;
//for(i=2;i<=MM;i++)
//    if(pr[i]==0)
//    for(j=2*i;j<=MM;j=j+i)pr[j]=1;
////vector de numere prime pana la 40000
//for(i=2;i<=MM;i++)
//    if(pr[i]==0)pr[++kk]=i;
//
//na=1;      //initial
//A[1]=1;    //memoram numarul 1
//fi>>n;
//for(i=1;i<=n;i++){
//    fi>>x;
//    y=1;
//    j=1;
//    while(pr[j]*pr[j]<=x){
//        p=0;d=pr[j];
//        while(x%d==0){p++;x=x/d;}
//        if(p)y=y*d;
//        j++;
//    }
//    if(x)y=y*x;
//    nb=0;
//    while(y){
//      c=y%10;
//      B[++nb]=c;
//      y=y/10;
//    }
//    inverseaza(B,nb);
//    inmulteste(A,na,B,nb,C,nc);
//    //afiseaza(A,na);afiseaza(B,nb);afiseaza(C,nc);
//    copiaza(C,nc,A,na);
//    //fo<<y<<" ";
//}
//afiseaza(A,na);
//return 0;
//}

//////40p timpul
//#include <iostream>
//#include<fstream>
//# define M 10000
//#define fi cin
//#define fo cout
//using namespace std;
////ifstream fi("arme.in");
////ofstream fo("arme.out");
//int p,x,y,d,c;
//int  A[M], B[M], C[M],i,na,nb,nc,n;
//int SOL[M], SOLF1[M], SOLF2[M],nsol,nsolf1,nsolf2;
//int S[M],ns,R[M],nr,P[M],np,R1[M],nr1,DEL[M],ndel,RR[M],nrr;
//char sir[100];
////pune pe 0 tot vectorul si na  pe 0
//void seteaza0(int A[M],int na){
//int i,n;
//na=0;
//n=M-1;
//for(i=0;i<=n;i++)A[i]=0;
//}
//void afiseaza(int A[M],int na){
//int i;
//for(i=1;i<=na;i++)fo<<A[i];fo<<" ";
//fo<<endl;
//}
////copiaza vectorul A in B
//void copiaza(int A[M],int na,int B[M],int &nb){
//int i;
//seteaza0(B,nb);
//nb=na;
//for(i=1;i<=na;i++)B[i]=A[i];
//}
////inverseaza vector A
//void inverseaza(int A[M],int na){
//int i,mij=na/2;
//for(i=1;i<=mij;i++)
//    swap(A[i],A[na-i+1]);
//}
//
////C=A*B  cu multe cifre fiecare
//void inmulteste(int A[M],int na,int B[M],int nb,int C[M],int &nc){
//int transport,i,x,j,AA[M],BB[M],naa,nbb;
//seteaza0(AA,naa);
//seteaza0(BB,nbb);
//seteaza0(C,nc);
//copiaza(A,na,AA,naa);
//copiaza(B,nb,BB,nbb);
//inverseaza(AA,naa);
//inverseaza(BB,nbb);
//for(i=1;i<=na;i++)
//    for(j=1;j<=nb;j++)
//        C[i+j-1]+=AA[i]*BB[j];
//nc=naa+nbb-1;
//transport=0;
//for(i=1;i<=nc;i++){
// x=transport+C[i];
// C[i]=x%10;
// transport=x/10;
// }
//if(transport>0)C[++nc]=transport;
//inverseaza(C,nc);
//}
//
//
//int main(){
//na=1;      //initial
//A[1]=1;    //memoram numarul 1
//fi>>n;
//for(i=1;i<=n;i++){
//    fi>>x;
//    y=1;
//    d=2;
//    while(d*d<=x){
//        p=0;
//        while(x%d==0){p++;x=x/d;}
//        if(p)y=y*d;
//        d++;
//    }
//    if(x)y=y*x;
//    nb=0;
//    while(y){
//      c=y%10;
//      B[++nb]=c;
//      y=y/10;
//    }
//    inverseaza(B,nb);
//    inmulteste(A,na,B,nb,C,nc);
//    //afiseaza(A,na);afiseaza(B,nb);afiseaza(C,nc);
//    copiaza(C,nc,A,na);
//    //fo<<y<<" ";
//}
//afiseaza(A,na);
//return 0;
//}

////40p timpul
//#include <iostream>
//#include<fstream>
//# define M 10000
//#define fi cin
//#define fo cout
//using namespace std;
////ifstream fi("arme.in");
////ofstream fo("arme.out");
//int p,x,y,d,c;
//int  A[M], B[M], C[M],i,na,nb,nc,n;
//int SOL[M], SOLF1[M], SOLF2[M],nsol,nsolf1,nsolf2;
//int S[M],ns,R[M],nr,P[M],np,R1[M],nr1,DEL[M],ndel,RR[M],nrr;
//char sir[100];
////pune pe 0 tot vectorul si na  pe 0
//void seteaza0(int A[M],int na){
//int i,n;
//na=0;
//n=M-1;
//for(i=0;i<=n;i++)A[i]=0;
//}
//void afiseaza(int A[M],int na){
//int i;
//for(i=1;i<=na;i++)fo<<A[i];fo<<" ";
//fo<<endl;
//}
////copiaza vectorul A in B
//void copiaza(int A[M],int na,int B[M],int &nb){
//int i;
//seteaza0(B,nb);
//nb=na;
//for(i=1;i<=na;i++)B[i]=A[i];
//}
////inverseaza vector A
//void inverseaza(int A[M],int na){
//int i,mij=na/2;
//for(i=1;i<=mij;i++)
//    swap(A[i],A[na-i+1]);
//}
//
////C=A*B  cu multe cifre fiecare
//void inmulteste(int A[M],int na,int B[M],int nb,int C[M],int &nc){
//int transport,i,x,j,AA[M],BB[M],naa,nbb;
//seteaza0(AA,naa);
//seteaza0(BB,nbb);
//seteaza0(C,nc);
//copiaza(A,na,AA,naa);
//copiaza(B,nb,BB,nbb);
//inverseaza(AA,naa);
//inverseaza(BB,nbb);
//for(i=1;i<=na;i++)
//    for(j=1;j<=nb;j++)
//        C[i+j-1]+=AA[i]*BB[j];
//nc=naa+nbb-1;
//transport=0;
//for(i=1;i<=nc;i++){
// x=transport+C[i];
// C[i]=x%10;
// transport=x/10;
// }
//if(transport>0)C[++nc]=transport;
//inverseaza(C,nc);
//}
//
//
//int main(){
//na=1;      //initial
//A[1]=1;    //memoram numarul 1
//fi>>n;
//for(i=1;i<=n;i++){
//    fi>>x;
//    y=1;
//    d=2;
//    while(x!=1){
//        p=0;
//        while(x%d==0){p++;x=x/d;}
//        if(p)y=y*d;
//        d++;
//    }
//    nb=0;
//    while(y){
//      c=y%10;
//      B[++nb]=c;
//      y=y/10;
//    }
//    inverseaza(B,nb);
//    inmulteste(A,na,B,nb,C,nc);
//    //afiseaza(A,na);afiseaza(B,nb);afiseaza(C,nc);
//    copiaza(C,nc,A,na);
//    //fo<<y<<" ";
//}
//afiseaza(A,na);
//return 0;
//}
////30p var I timp depasit
//#include <iostream>
//#define M 1000001
//using namespace std;
//int i,n,d,x,m,j,a,b,k,t;
//int pr[M+3],s[100003];
//int main(){
//cin>>n;
////ciur
//pr[1]=1;  //1 inseamna neprim si 0 inseamna prim
//for(i=2;i<=M;i++)
//    if(pr[i]==0)
//    for(j=2*i;j<=M;j=j+i)pr[j]=1;
//for(i=1;i<=n;i++)
//{
//        cin>>a>>b;
//        k=0;
//        for(x=a;x<=b;x++)
//            for(j=1;j<=x;j++)
//             if(x%j==0 and pr[j]==0 and pr[x/j]==0){k++;break;};
//        s[++t]=k;
//}
//for(i=1;i<=t;i++)cout<<s[i]<<" ";
//return 0;
//}

//#include <iostream>
//using namespace std;
//int a,b,x,y,z,k;
//
//int main(){
//cin>>a>>b;
//for(x=1;x<=100;x++)
//  for(y=x;y<=100;y++)
//    for(z=y;z<=100;z++)
//      if((x*y+x*z+y*z)*b==x*y*z*a)
//             {cout<<x<<" "<<y<<" "<<z<<'\n';k++;}
//if(k==0)cout<<"NU ARE SOLUTII";
//return 0;
//}
//1 1 2 1 2 3

// 1 2 1 3 2 1

////70p timpul
//#include <fstream>
//using namespace std;
//ifstream fi("primxxl.in");
//ofstream fo("primxxl.out");
//int i,n,x,k,sol,d,p;
//bool ok;
////verifica la ce putere apare d in desc. lui k!
////[k/p]+[k/p^2]+... [k/p^t]
//bool verif(int d,int p){
//int  pp,z=0;
//pp=d;
//while(pp<=k){
//    z+=k/pp;
//    pp*=d;
//}
//return (z>=p);
//}
//int main(){
//fi>>n>>k;
//for(i=1;i<=n;i++){
//    fi>>x;
//    ok=true;
//    d=2;
//    while(x!=1 and d*d<=x)
//    {
//        p=0;
//        while(x%d==0){p++;x=x/d;}
//        if(p>0)
//            if(!verif(d,p))ok=false;
//        d++;
//    }
//    if(x>1)if(!verif(x,1))ok=false;
//    if(ok)sol++;
//}
//fo<<sol;
//return 0;
//}

//100p fac dif. intre smini si smaxi
//smini - suma de la inceput pana la poz. minimului
//smaxi - suma de la inceput pana la poz. maximului

//#include <fstream>
//using namespace std;
//ifstream fi("memory002.in");
//ofstream fo("memory002.out");
//long long x,mini,maxi,p1,p2,s,n,i,smini,smaxi,sol;
//int main()
//{
//    mini=2e9+1;
//    maxi=-2e9-1;
//    fi>>n;
//    s=0;
//    for(i=1;i<=n;i++){
//        fi>>x;
//        s+=x;
//        if(x<mini){mini=x;smini=s;}
//        if(x>maxi){maxi=x;smaxi=s;}
//    }
//    if(smini<smaxi)sol=smaxi-smini+mini;
//    else sol=smini-smaxi+maxi;
//    fo<<sol;
//    return 0;
//}
////80p cu doua citiri din fisier timp depasit
//#include <fstream>
//using namespace std;
//ifstream fi("memory002.in");
//ofstream fo("memory002.out");
//long long x,mini,maxi,p1,p2,s,n,i;
//int main()
//{
//    mini=2e9+1;
//    maxi=-2e9-1;
//    fi>>n;
//    for(i=1;i<=n;i++){
//        fi>>x;
//        if(x<mini){mini=x;p1=i;}
//        if(x>maxi){maxi=x;p2=i;}
//    }
//    fi.close();
//    ifstream fi("memory002.in");
//    if(p2<p1)swap(p1,p2);
//    fi>>n;
//    for(i=1;i<=n;i++){
//        fi>>x;
//        if(i>=p1 and i<=p2)s+=x;
//    }
//    fo<<s;
//    return 0;
//}
////var II 65p cu cer 3 cu long double!!!)
//#include <fstream>
//#include <iomanip>
//using namespace std;
//ifstream  fin("numere24.in");
//ofstream fout("numere24.out");
//int c,n,i,x,y,z,inv,cif,k;
//long long rez;
//int main()
//{
//    fin>>c;
//    if(c==1){
//            fin>>n;
//            if(n==0){fout<<0;return 0;}
//            rez=(long long)(n-1)*10; //!!!
//            fout<<rez;
//            return 0;
//   }
//    if(c==2){
//            fin>>x;
//            //taiat o cifra
//            y=x/10;
//            if(y%10==0)fout<<0;
//            else
//            {
//                inv=0;z=y;
//                while(y){
//                    cif=y%10;
//                    inv=inv*10+cif;
//                    y=y/10;
//                }
//                if(inv==z)fout<<1;
//                else fout<<2;
//            }
//            fout<<" ";
//            //taiat 2 cifre
//            y=x/100;
//            if(y%10==0)fout<<0;
//            else
//            {
//                inv=0;z=y;
//                while(y){
//                    cif=y%10;
//                    inv=inv*10+cif;
//                    y=y/10;
//                }
//                if(inv==z)fout<<1;
//                else fout<<2;
//            }
//            fout<<" ";
//            //taiat 3 cifre
//            y=x/1000;
//            if(y%10==0)fout<<0;
//            else
//            {
//                inv=0;z=y;
//                while(y){
//                    cif=y%10;
//                    inv=inv*10+cif;
//                    y=y/10;
//                }
//                if(inv==z)fout<<1;
//                else fout<<2;
//            }
//            fout<<" ";
//            return 0;
//   }
//   if(c==3){
////        unsigned long long pp,p,nr_tot,nr_10,nr_pal,sol;
////            fin>>k;
////            if(k==1){fout<<9;return 0;}
////            p=1;
////            for(i=1;i<=k-1;i++)p=p*10;
////            pp=1;
////            for(i=1;i<=(k-1)/2;i++)pp=pp*10;
////            nr_tot=9*p;
////            nr_10=nr_tot/10;
////            nr_pal=9*pp;
////            sol=2*(nr_tot-nr_10-nr_pal)+nr_pal;
////            fout<<sol;
//            long double pp,p,nr_tot,nr_10,nr_pal,sol;
//            fin>>k;
//            if(k==1){fout<<9;return 0;}
//            p=1;
//            for(i=1;i<=k-1;i++)p=p*10;
//            pp=1;
//            for(i=1;i<=(k-1)/2;i++)pp=pp*10;
//            nr_tot=9*p;
//            nr_10=nr_tot/10;
//            nr_pal=9*pp;
//            sol=2*(nr_tot-nr_10-nr_pal)+nr_pal;
//            fout<<fixed<<setprecision(0)<<sol;
//   }
//return 0;
//}

//
//#include <fstream>
//#define M 103
//using namespace std;
//ifstream  fin("fermier.in");
//ofstream fout("fermier.out");
//int d[M],q[M],dist[M];
//int i,n,c,j,d1,d2,Stot,cant,nr_ture_suplimentare;
//long long DrumTot;
//int main()
//{
//    fin>>n>>c;
//    for(i=0;i<=n;i++)fin>>d[i];
//    for(i=1;i<=n;i++)fin>>q[i];
//    for(i=0;i<=n;i++)
//        Stot+=d[i];//Stot - suma pe tot circuitul
//    for(i=0;i<=n;i++)            //dist[i]-este distanta de la depozit la ferma i
//        dist[i+1]=dist[i]+d[i];  //o precalalculam ca sa ne incadram in timp
//    cant=c;//cant-  este cantitatea de ingrasaminte ce o avem initialin masina
//    for(i=0;i<=n;i++)
//    {
//     if(cant==0 ){ // a ramas  zero in masina  bai!! (nu are rost sa mergem la i+1 cu gol!)
//        //mergem la depozit si ne intoarcem  la i+1  cu plin c
//        //pas 1- merg de la ferma i la depozit si incarc c
//        d1=dist[i];   //direct
//        d2=Stot-dist[i]; //invers
//        DrumTot+=min(d1,d2);
//        cant=c;
//        //pas 2- merg de la depozit(incarcat) la ferma i+1
//        d1=dist[i+1];   //direct
//        d2=Stot-dist[i+1]; //invers
//        DrumTot+=min(d1,d2);
//     }
//     else //cantitate diferita de 0 deci ne deplasam de la i la i+1
//     {
//        //ne deplasam de la i la i+1
//         d1=d[i];   //direct
//         d2=Stot-d[i]; //invers
//         DrumTot+=min(d1,d2);
//     }
//    //am ajuns la ferma i+1(deci facem livrarea c)
//    if(cant>=q[i+1])    //avem ingrasaminte suficiente pentru a alimenta complet ferma i+1
//            {cant-=q[i+1];q[i+1]=0;}
//    else {  //nu ajunge cantitate c pentru a alimenta complet ferma i+1
//                q[i+1]-=cant;
//                cant=0;
//                 //realimentam masina cu ingrasamant de cate ori trebuie
//                nr_ture_suplimentare=q[i+1]/c;
//                if(q[i+1]%c>0)nr_ture_suplimentare++;
//                DrumTot+=nr_ture_suplimentare*2*min(dist[i+1],Stot-dist[i+1]);//facen o alimentare comleta
//                cant=nr_ture_suplimentare*c-q[i+1];//calc. cantitatea ramasa dupa terminarea  q[i+1]
//        }
//     }
//     fout<<DrumTot;
//return 0;
//}
//#include <fstream>
//using namespace std;
//ifstream fin("colier.in");
//ofstream fout("colier.out");
//long long  ucif,a[50001],b[50001];
//int i,j,x,n,s,p,z,t,k,poz_mini,mini,maxi,poz_maxi;
//int main()
//{
//    fin>>t>>n;
//    for(i=1;i<=n;i++)fin>>a[i];
//    //construire vector  b[] cu  1 si 2 in functie de tipul elementului
//    for(i=1;i<=n;i++){
//        x=a[i];
//        maxi=0;mini=10;k=0;
//        while(x>0){
//            ucif=x%10;
//            k++;
//            if(ucif>maxi){maxi=ucif;poz_maxi=k;}
//            if(ucif<mini){mini=ucif;poz_mini=k;}
//            x=x/10;
//        }
//       if(poz_mini>poz_maxi)b[i]=1;
//       else b[i]=2;
//    }
//    if(t==1){
//         z=0;//numar elemente de tipul 1
//         for(i=1;i<=n;i++)
//            if(b[i]==1)z++;
//         fout<<z;
//    }
//pt cazul t==2
//fie k numarul de  schimbari de tip(1->2 sau 2->1)
//avem sol k-1 daca b[1]==b[n]
//avem sol k daca b[1]!=b[n]
//pt 1 1 1 2 2 1 1 1 2 1 1 1  => 1 2 1 2 1  => sol = 4
//1 2 1 2 =>sol = 4
//    if(t==2){
//
//         int sol=1;//numar schimbari de tip(1->2 sau de la 2->1)
//         for(i=1;i<n;i++)
//            if(b[i]!=b[i+1])sol++;
//         if(b[1]==b[n])sol--;
//         if(sol==0)fout<<1;//cazul 1 1 1 1 => sol=1;
//         else fout<<sol;
//    }
//    return 0;
//}
//#include <fstream>
//#include <cmath>
//using namespace std;
//ifstream f("cufar.in");
//ofstream g("cufar.out");
//int d,p,n,c[1010],x,y,i,j,k,a[1010],b[1010],maxi,s;
//int main()
//{
//         f>>p>>n;
//         if(p==1) {
//                f>>x>>y;d=sqrt(x);
//                  for(i=2; i<=x; i++)
//                           c[i]=i;
//                  for(i=2; i<=d+1; i++){j=2;
//                           while(j*i<=x)
//                                    {if(c[j*i]!=0)c[j*i]=0;j++;}}
//                  for(i=2; i<=x; i++)
//                           if(c[i]!=0) {
//                                    if(x%c[i]==0)k++;
//                                    if(k==y) {
//                                             g<<c[i];
//                                             break;
//                                    }
//                           }
//         }
//         if(p==2) {
//            for(i=1; i<=n; i++) {
//                f>>a[i]>>b[i];
//                if(a[i]>maxi)maxi=a[i];
//                  }maxi=sqrt(maxi);
//            for(i=2; i<=maxi; i++)
//                c[i]=i;
//            for(i=2; i<=maxi; i++)
//                for(j=2; j<=maxi; j++)
//                if(c[j*i]!=0)c[j*i]=0;
//
//            for(j=1; j<=n; j++){k=0;
//            for(i=2; i<=a[j]; i++)
//                if(c[i]!=0) {
//                if(a[j]%c[i]==0)k++;
//                if(k==b[j])
//                {s+=c[i];break;}
//                                    }}
//
//            g<<s;
//         }
//         /*
//                           f>>x>>y;d=sqrt(x);
//                  for(i=2; i<=x; i++)
//                           c[i]=i;
//                  for(i=2; i<=d+1; i++){j=2;
//                           while(j*i<=x)
//                                    {if(c[j*i]!=0)c[j*i]=0;j++;}}
//                  for(i=2; i<=x; i++)
//                           if(c[i]!=0) {
//                                    if(x%c[i]==0)k++;
//                                    if(k==y) {
//                                             g<<c[i];
//                                             break;
//                                    }
//                           }
//                           */
//        return 0;
//}
//
//
////var I  100p
//// descompunere in factori primi  cu ciur
////se merge pt. fiecare x pana la sqrt(x)
////Daca ramane ceva ce ramane este numar prim
//#include<fstream>
//#include<cmath>
//#define M 1000003
//using namespace std;
//ifstream fi("cufar.in");
//ofstream fo("cufar.out");
//bool a[M];//ciurul
//int b[M];//vectorul cu numere prime
//int i,n,k,p,v,x,r,y,nb,d,nrd,j;
//long long s;
//int main(){
////ciurul
//for(i=2;i<=M-3;i++)
//    if(a[i]==0)
//      for(j=2*i;j<=M-3;j=j+i)a[j]=1;
//for(i=2;i<=M-3;i++)
//    if(a[i]==0)b[++nb]=i;
////for(i=1;i<=100;i++)fo<<b[i]<<" ";
//    fi>>v>>n;
//    //cer 1
//    if(v==1){  //fara ciur cu se incadreaza in timp
//       fi>>x>>k;
//       d=2;y=x;
//       while(d*d<=y and x!=1)
//       {
//           p=0;
//           while(x%d==0){p++;x=x/d;}
//           if(p)nrd++;
//           if(nrd==k){fo<<d;return 0;}
//           d++;
//       }
//      fo<<x;//ramane un numar prim
//      return 0;   //daca nu a iesit deja cu break
//
//    }
//    //cer 2
//    if(v==2){
//     for(i=1;i<=n;i++){
//       fi>>x>>k;
//       j=1;y=x;
//       nrd=0;
//       int afis=0;
//       while(b[j]*b[j]<=y and x!=1)//merg pana la sqrt(x)
//       {
//           p=0;
//           while(x%b[j]==0){p++;x=x/b[j];}
//           if(p)nrd++;
//           if(nrd==k){s=s+(long long)b[j];afis=1;break;}
//           j++;
//       }
//      if(afis==0)s=s+(long long)(x);//ramane un numar prim
//     }
//    fo<<s;
//    }
//
//return 0;
//}
////var II 62p
//// descompunere in factori primi
////pana la sqrt(x). Daca ramane ceva este numar prim.
//#include<fstream>
//using namespace std;
//ifstream fi("cufar.in");
//ofstream fo("cufar.out");
//int i,n,k,p,v,x,r,y,nb,d,nrd;
//long long s;
//int main(){
//
//    fi>>v>>n;
//    //cer 1
//    if(v==1){
//       fi>>x>>k;
//       d=2;y=x;
//       while(d*d<=y and x!=1)
//       {
//           p=0;
//           while(x%d==0){p++;x=x/d;}
//           if(p)nrd++;
//           if(nrd==k){fo<<d;return 0;}
//           d++;
//       }
//      fo<<x;//ramane un numar prim
//      return 0;   //daca nu a iesit deja cu break
//
//    }
//    //cer 2
//    if(v==2){
//     for(i=1;i<=n;i++){
//       fi>>x>>k;
//       d=2;y=x;
//       nrd=0;
//       int afis=0;
//       while(d*d<=y and x!=1)  //desc. pana la sqrt(x)
//       {
//           p=0;
//           while(x%d==0){p++;x=x/d;}
//           if(p)nrd++;
//           if(nrd==k){s=s+(long long)d;;afis=1;break;}
//           d++;
//       }
//      if(afis==0)s=s+(long long)(x);//ramane un numar prim
//     }
//    fo<<s;
//    }
//
//return 0;
//}

//#include<fstream>
//using namespace std;
//ifstream fi("gogosi.in");
//ofstream fo("gogosi.out");
//int a[1000003],c[1000003];
//int i,n,k,p;
//
////k = poz. pt. cel mai mare el.<= ca a[i];
////adica unde se va aseza x in sirul de cozi
//int cbin(int x,int &k){
// int st,dr,mij;
// if(x<c[k]){k++;return k;} //daca se pune x in coada noua
// st=1;dr=k;  //daca trebuie cautata pozitia in sir
// while(st<dr){
//    mij=(st+dr)/2;
//    if(x<c[mij])st=mij+1; //in cazul asta c[mij] nu va fi sol. pt ca este mai mare ca x
//    else dr=mij;  //x>=c[mij]- este  posibil ca c[mij] sa fie chiar solutie
// }
// return st;
//}
//int main(){
//
//    fi>>n;
//    for(i=1;i<=n;i++)fi>>a[i];
//    c[1]=a[1];k=1;
//    for(i=2;i<=n;i++)
//    {
//        p=cbin(a[i],k);//p = poz. pt. cel mai mare el.<=ca a[i];
//        c[p]=a[i];
//    }
//    fo<<k;
//return 0;
//}
//#include<fstream>
//#include<iomanip>
//#define M 30003
//using namespace std;
//ifstream fi("concurs4.in");
//ofstream fo("concurs4.out");
//int i,j,n,k,p,q,m,t,T,nb;
//int ant[M],urm[M],a[M];
//bool ciur[12*M+3];
//int b[M];
//int main()
//{
////generare Ciur cu primele 30000 numere prime
//T=12*M;
//for(i=2;i<=T;i++)
//    if(ciur[i]==0)
//      for(j=2*i;j<=T;j=j+i)ciur[j]=1;
//for(i=2;i<=T;i++)
//    if(ciur[i]==0)
//              if(nb<30000)
//                    b[++nb]=i;
////for(i=1;i<=100;i++)fo<<b[i]<<" ";
////fo<<nb<<endl;
//fi>>n>>k;
//ant[1]=n;   //memoram ant[] si urm[] pentru rapiditate
//for(i=2;i<=n;i++)ant[i]=i-1;
//urm[n]=1;
//for(i=1;i<n;i++)urm[i]=i+1;
//m=n;
//i=1; //pornim de la poz 1
//while(m){
//  t++;
//  a[i]=t;  //notam elementul
//  p=ant[i];//stergem elementul ce a fost ales
//  q=urm[i];  //gen alocare dinamica p i q
//  urm[p]=q;
//  ant[q]=p;
//  i=q;   //facem pasii urmatori catre urmatorul element
//  for(j=2;j<=k;j++)i=urm[i];
//  m--;
////  fo<<m<<endl;
////  for(j=1;j<=n;j++)fo<<setw(3)<<ant[j];fo<<endl;
////  for(j=1;j<=n;j++)fo<<setw(3)<<a[j];fo<<endl;
////  for(j=1;j<=n;j++)fo<<setw(3)<<urm[j];fo<<endl;
//}
//for(i=1;i<=n;i++)fo<<b[a[i]]<< " ";
//return 0;
//}
//#include<fstream>
//using namespace std;
//ifstream fi("coada2.in");
//ofstream fo("coada2.out");
//int x,k,cif,n,j,s,cu,i,y;
//int main()
//{
//fi>>n;
//for(i=1;i<=n;i++){
//    fi>>x;
//    y=x;
//    cu=x%10;
//    x=x/10;
//    k=1;
//    while(x){
//     cif=x%10;
//     k++;
//     x=x/10;
//    }
//    if(k==1)s=s+y;
//    else
//    if(cif==cu){
//            k=k/2;
//            for(j=1;j<=k;j++)y=y/10;
//            s=s+y%10;
//    }
//}
//fo<<s;
//return 0;
//}

//#include<fstream>
//using namespace std;
//ifstream fi("bloc.in");
//ofstream fo("bloc.out");
//long long n,k,p,nr_numere,cat,rest,s_tot;
//int main()
//{
//fi>>k>>p>>n;
//nr_numere=n*p+p;
//cat=nr_numere/k;
//rest=nr_numere%k;
//s_tot=cat*k*(k+1)/2+rest*(rest+1)/2;
//fo<<s_tot;
//return 0;
//}
//#include<fstream>
//using namespace std;
//ifstream fi("interviu.in");
//ofstream fo("interviu.out");
//int n,p,i,maxi,a[103];
//int main()
//{
//fi>>n;
//for(i=1;i<=n;i++)fi>>a[i];
//p=0;
//maxi=max(max(a[1],a[2]),a[3]);
//for(i=4;i<=n;i++)
//    if(a[i]>maxi){p=i;break;}
//if(p==0)fo<<n;
//else fo<<p;
//return 0;
//}
//
////inundatii  infoarena 100p
//#include <fstream>
//#include <algorithm>
//using namespace std;
//ifstream f("inundatie.in");
//ofstream g("inundatie.out");
//int nn,n,mm,x,i,nrq,poz,ok,minn,maxx,mid,st,dr,k,a[90030];
//unsigned long long b[90030],s;
//int cautare_bin_poz(int y){//returneaza poz elementului x daca exista in sir
//  int st,dr,k;              //sau poz elementului mai mare ca x daca x nu exista in sir
//   st=1; dr=n; k=0;
//   while(st<=dr){
//       mid=(st+dr)/2;
//       if(a[mid]==x)return mid;
//       if (a[mid]>x) dr=mid-1;
//       else st=mid+1;
//        }
//   return dr;
//}
//int main()
//{
//    f>>nn>>mm;
//    for (i=1; i<=nn*mm; i++){
//        f>>x;
//        if(x>0){n++;a[n]=x;}
//    }
//    sort(a+1,a+n+1);
//    f>>nrq;
//    for (i=1; i<=n; i++){
//        s=s+a[i]; b[i]=s;
//    }
//    for(i=1; i<=nrq; i++){
//        f>>x; x--;;
//        k=cautare_bin_poz(x);
//        if (x==-1)g<<0<<'\n';
//        else g<<b[k]+x*(n-k)<<'\n';
//    }
//    f.close();g.close();
//    return 0;
//}
////30p timpul!
//#include <iostream>
//#include <fstream>
//#include <algorithm>
//using namespace std;
//ifstream f("inundatie.in");
//ofstream g("inundatie.out");
//long long a[90001],nr,n,i,j,k,x,q,s,m;
//int main()
//{
//    f>>n>>m;
//    nr=n*m;
//    for(i=1;i<=nr;i++)
//      {j++;
//       f>>a[j];
//      }
//    sort(a+1,a+nr+1);
//    f>>q;
//    for(j=1;j<=q;j++) {
//       f>>x;s=0;
//    if(x>1)
//    for(i=1;i<=nr;i++) if(a[i])
//       if(a[i]<x) s+=a[i];
//        else break;
//    s+=(x-1)*(nr-i+1);
//    g<<s<<'\n';}
//
//    f.close ();
//    g.close ();
//    return 0;
//}

//#include<fstream>
//using namespace std;
//ifstream fi("elfii.in");
//ofstream fo("elfii.out");
//int x,y,z,kp,k0;
//int main(){
//fi>>x>>y>>z;
////caz 1 toate impare
//if(x%2==1 and y%2==1 and z%2==1){fo<<"Poate data viitoare!";return 0;}
//
//if(x==0)k0++; //k0 numar cifre de 0
//if(y==0)k0++;
//if(z==0)k0++;
//if(x%2==0)kp++; //kp numar cifre pare
//if(y%2==0)kp++;
//if(z%2==0)kp++;
//
//if(x<y)swap(x,y); //asezare cifre descrescator
//if(x<z)swap(x,z);
//if(y<z)swap(y,z);
//if(k0==0){  //fara cifre de 0
//    if(kp==3){fo<<6<<'\n'<<x<<y<<z;return 0;} //toate pare
//    if(kp==2){fo<<4<<'\n';   //doua pare
//              if(z%2==0)fo<<x<<y<<z;
//              else fo<<x<<z<<y;
//              return 0;
//              }
//    if(kp==1){fo<<2<<'\n';  //una para
//              if(x%2==0)fo<<y<<z<<x;
//              if(y%2==0)fo<<x<<z<<y;
//              if(z%2==0)fo<<x<<y<<z;
//              return 0;
//              }
//}
//if(k0==1){  //o cifra de 0
//    if(kp==3){fo<<4<<'\n'<<x<<y<<z;return 0;} //toate pare
//    if(kp==2){fo<<3<<'\n';   //doua pare
//              if(z%2==0)fo<<x<<y<<z;
//              else fo<<x<<z<<y;
//              return 0;
//              }
//    if(kp==1){fo<<4<<'\n';  //una para
//              fo<<x<<y<<z;
//              return 0;
//              }
//}
//if(k0==2){  //doua cifre de 0
//
//              fo<<2<<'\n';
//              fo<<x<<y<<z;
//              return 0;
//
//}
//return 0;
//}

//#include <fstream>
//#include <iomanip>
//# define M 200001
//using namespace std;
//ifstream fin ("strabunica.in");
//ofstream fout ("strabunica.out");
//long long i,n,k,j,maxi,a[M],st[M],s[M],d[M];
//int main()
//{
//   fin>>n;
//   for(i=1;i<=n;i++)fin>>a[i];
//   //construim vectorul s
//   for(i=1;i<=n;i++){
//    while(k>=1 && a[st[k]]>a[i])k--;
//    if(k>=2 && a[st[k-1]]==a[st[k]] && a[st[k]]==a[i])k--;
//    st[++k]=i;
//    //for(j=0;j<=k;j++)fout<<a[st[j]]<<" ";fout<<endl;
//    if(k>=2 && a[st[k-1]]==a[st[k]])
//              s[i]=st[k]-st[k-2];
//     else s[i]=st[k]-st[k-1];
//   }
//  //construim vectorul d
//   k=0;
//   st[k]=n+1;
//   for(i=n;i>=1;i--){
//    while(k>=1 && a[st[k]]>a[i])k--;
//    if(k>=2 && a[st[k-1]]==a[st[k]] && a[st[k]]==a[i])k--;
//    st[++k]=i;
//    //for(j=0;j<=k;j++)fout<<a[st[j]]<<" ";fout<<endl;
//    if(k>=2 && a[st[k-1]]==a[st[k]])
//              d[i]=st[k-2]-st[k];
//     else d[i]=st[k-1]-st[k];
//   }
////   for(i=1;i<=n;i++)fout<<setw(3)<<s[i];fout<<endl;
////   for(i=1;i<=n;i++)fout<<setw(3)<<d[i];fout<<endl;
//   for(i=1;i<=n;i++)
//    if(a[i]*(s[i]+d[i]-1)>maxi)maxi=a[i]*(s[i]+d[i]-1);
//   fout<<maxi;
//   return 0;
//}

























//#include <iosream>
//#include <fsream>
//using namespace sd;
//ifsream fin("g2.in");
//ofsream fout("g2.out");
//
//int main()
//{
//    long long n,v[10000003],i,x,c;
//    fin>>n;
//    for(i=2;i*i<n;i++)
//    {
//        while(n%i==0)
//        {
//           v[i]=i;
//           n=n/i;
//        }
//    }
//    for(i=2;i<n;i++)
//    {
//        if(v[i]>9)x=0;
//        else x=1;
//    }
//    if(x==0)fout<<'0';
//    else
//    {
//        fout<<v[2];
//        for(i=k;i<n;i++)
//        {
//           while(c<10)
//           {
//               c=v[i]*v[i+1];
//           }
//           fout<<c;
//        }
//
//    }
//    fin.close();
//    fout.close();
//    return 0;
//}



//
////Gonda Bogdan
//// clasa a VIII-a
//
//
//#include <iosream>
//#include <fsream>
//#include <cmath>
//using namespace sd;
//
//ifsream fin("sircifre.in");
//ofsream fout("sircifre.out");
//int v[501];
//    int k[501];
//int abs(int x){
// if(x<0)return -x;
// else return x;
//}
//int main()
//{
//
//int s=0;
//int cnt4=0;
//int cnt1=0;
//    int n;
//    int cnt=1;
//
//    int l[10]={0};
//    fin>>n;
//    int p=n;
//
//    for(int i=1;i<=n;i++)
//        {fin>>v[i];
//        k[i]=v[i];}
//    while(cnt>0)
//    {
//        cnt=0;
//
//        for(int i=1;i<n;i++)
//    {
//      if(abs(v[i]-v[i+1])==1 && v[i]!=0 && v[i+1]!=0)
//            {
//
//cnt++;
//s=0;
//            for(int j=i+2;j<=n;j++)
//                {
//
//                    v[i+s]=v[j];
//                    s++;
//                }v[i+s+1]=0;
//v[i+s+2]=0;
//n=n-2;cnt1++;
//
//
//
//            }
//
//    }
//
//    }
//
//    for(int i=1;i<=n;i++)
//    {
//        l[v[i]]++;
//    }
//
//for(int i=1;i<=n;i++)
//{
//    if(l[i]!=0)
//        {
//            cnt4++;
//            fout<<i<<" "<<l[i]<<"\n";
//        }
//
//}
//if(cnt4==0)
//            fout<<-1;
//
//
//
//
//
//    return 0;
//}

/////Dobricean Ioan
///// siva cu complexitatea O(n)
//#include <sack>
//#include <fsream>
//#include <cmath>
//using namespace sd;
//ifsream fin ("sircifre.in");
//ofsream fout ("sircifre.out");
//int n,val,F[11],x;
//sack <int> S;
//int abs(int x){
// if(x<0)return -x;
// else return x;
//}
//int main() {
//    int i;
//fin >> n;
//for( i = 1; i <= n; i++) {
//    fin >> x;
//    if(S.empty())  S.push(x) , F[x]++;
//    else {
//         val = S.top();
//        if(abs(val-x) == 1) {
//            S.pop();
//            F[val]--;
//            }
//        else  {
//            S.push(x);
//            F[x]++;
//            }
//
//}
//}
//bool ok = false;
//for(i = 0; i <= 9; i++) {
//    if(F[i] > 0)
//    fout << i << " " << F[i] <<"\n" ,ok = true;
//    }
//if(!ok) fout << -1;
//}
///// Doamne ajuta

//#include <fsream>
//using namespace sd;
//ifsream fi("sortare.in");
//ofsream fo("sortare.out");
//int a[1001],i,j,n,aux;
//int abs(int x){
// if(x<0)return -x;
// else return x;
//}
//int main()
//{
//    //citirea
//    fi>>n;
//    for(i=1;i<=n;i++)fi>>a[i];
//    //ordonarea
//    for(i=1;i<=n;i++)
//        for(j=i+1;j<=n;j++)
//         if(a[i]<a[j]){
//            aux=a[i];
//            a[i]=a[j];
//            a[j]=aux;
//         }
//    //afisarea
//    for(i=1;i<=n;i++)fo<<a[i]<<" ";
//    return 0;
//}
//
//
//



















////cu doua citiri din fisier
//#include <fsream>
//using namespace sd;
//ifsream fi("memory002.in");
//ofsream fo("memory002.out");
//long long x,mini,maxi,p1,p2,s,n,i;
//int main()
//{
//    mini=2e9+1;
//    maxi=-2e9-1;
//    fi>>n;
//    for(i=1;i<=n;i++){
//        fi>>x;
//        if(x<mini){mini=x;p1=i;}
//        if(x>maxi){maxi=x;p2=i;}
//    }
//    fi.close();
//    ifsream fi("memory002.in");
//    if(p2<p1)swap(p1,p2);
//    fi>>n;
//    for(i=1;i<=n;i++){
//        fi>>x;
//        if(i>=p1 and i<=p2)s+=x;
//    }
//    fo<<s;
//    return 0;
//}

//#include <fsream>
//using namespace sd;
//ifsream fi("memory005.in");
//ofsream fo("memory005.out");
//int i,n,x,k;
//long long M =666013;
//long long sol;
//int main()
//{
//    fi>>n;
//    for(i=1;i<=n;i++)
//    {
//        fi>>x;
//        if(x%2==1)k++;
//    }
//    //calculam 2^(n-1)
//    sol=1;
//    for(i=1;i<=n-1;i++)
//        sol=((long long)2*sol)%M;
//    //daca avem numai elemente pare avem sol 2^n-1(altfel 2^(n-1)-1
//    if(k==0)fo<<((long long)2*sol)%M-1;
//    else fo<<sol-1;
//    return 0;
//}

//dem cu rel de recursivitate
//dp[0][j] - cate submultimi cu suma para din primele j elemente  avem
//dp[1][j]- cate submultimi cu suma impara din primele j elemente  avem

//dp[0][j+1]=dp[0][j]+dp[1][j]
//dp[1][j+1]=dp[0][j]+dp[1][j]=>ele sunt egale si dp[0][j+1]=dp[1][j+1]=2^j