Cod sursa(job #3270832)

Utilizator Sp1k3CSpike Dog Sp1k3C Data 24 ianuarie 2025 16:09:25
Problema Asmax Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 128.55 kb
/*#include<iostream>
#include<fstream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
ifstream fin("fibosnek.in");
ofstream fout("fibosnek.out");
int c, n, m, maxy = 1, nr = 0;
vector<int> v;
set<int> S;
void read()
{
	int i, j;
	for (i = 0;i < n;i++)
		for (j = 0;j < m;j++)
		{
			fin >> v[i + j * n];
			if (maxy < v[i + j * n])
				maxy = v[i + j * n];
		}
}
void fibosnek()
{
	S.insert(1);
	int x = 1, y = 1, t, j;
	while (x + y <= maxy)
	{
		S.insert(x + y);
		t = x;
		x += y;
		y = t;
	}
}
void solve1()
{
	int i, j;
	for (i = 0;i < n * m;i++)
		if (S.find(v[i]) != S.end())
			nr++;
	fout << nr;
}
void fibo(int& x)
{
	int q = 1, y = 1, t, i, j;
	bool ok = 0;
	for (i = 0;!ok;i++)
	{
		if (x > q and x < y)
			if (x - q <= y - x)
			{
				x = q;
				ok = 1;
			}
			else
			{
				x = y;
				ok = 1;
			}
		t = q;
		q = y;
		y = q + t;
	}
}
void solve2()
{
	int s = 0, t, i, sol = 0, l = 0, j, L = 0, k;
	bool ok;
	for (i = 0;i < n * m;i++)
		if (S.find(v[i]) == S.end())
		{
			s = 0;
			k = i;
			t = v[i];
			fibo(t);
			s += t;
			ok = 1;
			for (j = i - 1;j >= 0 and ok;j--)
				if (S.find(v[j]) != S.end())
					s += v[j];
				else
					ok = 0;
			if (ok == 1)
				l += i;
			else
				l += i - j + 1;
			ok = 1;
			for (j = i + 1;j < n * m and ok;j++)
				if (S.find(v[j]) != S.end())
					s += v[j];
				else
					if (S.find(v[j - 1]) == S.end())
					{
						t = v[j];
						fibo(t);
						s += t;
						k = j;
					}
					else
						ok = 0;
			if (ok == 1)
				l += n * m - k;
			else
				l += j - k;
			if (L < l)
			{
				L = l;
				sol = s;
			}
			l = 0;
			i = k;
		}
	fout << sol;
}
int main()
{
	fin >> c >> n >> m;
	v.resize(n * m);
	read();
	fibosnek();
	if (c == 1)
		solve1();
	else
		solve2();
}*/

/*#include<iostream>
#include<fstream>
#include<stack>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	string text;
	ifstream fin("expresie.in");
	ofstream fout("expresie.out");
	short x;
	vector<int> v;
	stack<int> S;
	int i = 0, nr = 0, s, smax;
	getline(fin, text);
	while (i < text.length())
		if (text[i] == '(')
		{
			S.push(-10000);
			i++;
		}
		else
			if (text[i] == '[')
			{
				S.push(-10001);
				i++;
			}
			else
				if (text[i] == ',')
				{
					nr++;
					i++;
				}
				else
					if (text[i] == '-')
					{
						i++;
						x = 0;
						while (isdigit(text[i]))
						{
							x = x * 10 + (text[i] - '0');
							i++;
						}
						S.push(x * (-1));
					}
					else
						 if (isdigit(text[i]))
                        {
                            x = 0;
                            while (isdigit(text[i]))
                            {
                                x = x * 10 + (text[i] - '0');
                                i++;
                            }
                            S.push(x);
                        }
                        else
                            if (text[i] == ')')
                            {
                                s = S.top();
                                smax = s;
                                S.pop();
                                while (S.top() != -10000)
                                {
                                    s += S.top();
                                    if (s < S.top())
                                        s = S.top();
                                    if (s > smax)
                                        smax = s;
                                    S.pop();
                                }
                                S.pop();
                                S.push(smax);
                                i++;
                            }
                            else
                                if (text[i] == ']')
                                {
                                    v.clear();
                                    while (S.top() != -10001)
                                    {
                                        v.push_back(S.top());
                                        S.pop();
                                    }
                                    sort(v.begin(), v.end());
                                    S.pop();
                                    S.push(v[(v.size() - 1) / 2]);
                                    i++;
                                }
    s = 0;
    while (!S.empty())
    {
        s += S.top();
        S.pop();
    }

    fout << nr + 1 << '\n' << s;
}*/

//Backtracking
/*#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> v;
vector<bool> folosit;
void Bckt(int k)
{
	if (k == n + 1)
	{
		for (int i = 1;i <= n;i++)
			cout << v[i] << " ";
		cout << endl;
	}
	else
		for (int i = 1;i <= n;i++)
		{
			v[k] = i;
			if (folosit[i] == false)
			{
				folosit[i] = true;
				Bckt(k + 1);
				folosit[i] = false;
			}
		}
}
int main()
{
	cin >> n;
	v.resize(n + 1);
	folosit.resize(n + 1);
	Bckt(1);
}*/
/*#include<iostream>
#include<vector>
using namespace std;
int n, m;
vector<int> v;
void Bckt(int k)
{
	if (k == m + 1)
	{
		for (int i = 1;i <= m;i++)
			cout << v[i] << " ";
		cout << endl;
	}
	else
		for (int i = v[k - 1] + 1;i <= n;i++)
		{
			v[k] = i;
			Bckt(k + 1);
		}
}
int main()
{
	cin >> n >> m;
	v.resize(m + 1);
	Bckt(1);
}*/

/*#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
ifstream fin("fraze.in");
ofstream fout("fraze.out");
int main()
{
	map<char, int> M;
	string text;
	vector<string> v;
	int i, sz, nr = 0, pf, nrpf = 0;
	while (getline(fin, text))
	{
		M.clear();
		sz = text.size();
		pf = 1;
		for (i = 0;i < sz;i++)
			if (islower(text[i]) or isupper(text[i]))
			{
				M[tolower(text[i])]++;
				if (M[tolower(text[i])] > 1)
					pf = 0;
			}
		if (M.size() == 26)
		{
			nr++;
			if (pf)
				nrpf++;
			v.push_back(text);
		}
	}
	fout << nr << " " << nrpf << endl;
	sort(v.begin(), v.end());
	sz = v.size();
	for (i = 0;i < sz;i++)
		fout << v[i] << endl;
}*/
/*#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> v;
vector<bool> folosit;
void Bckt(int k)
{
	if (k == n + 1)
	{
		for (int i = 1;i <= n;i++)
			cout << v[i] << " ";
		cout << endl;
	}
	else
		for (int i = 1;i <= n;i++)
		{
			v[k] = i;
			if (folosit[i] == false)
			{
				folosit[i] = true;
				Bckt(k + 1);
				folosit[i] = false;
			}
		}
}
int main()
{
	cin >> n;
	v.resize(n + 1);
	folosit.resize(n + 1);
	Bckt(1);
}*/
/*#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
	int n, i;
	cin >> n;
	vector<int> v(n), x(n);
	for (i = 0;i < n;i++)
	{
		cin >> x[i];
		v[i] = i;
	}
	do
	{
		for (i = 0;i < n;i++)
			cout << x[v[i]] << " ";
		cout << endl;
	} while (next_permutation(v.begin(), v.end()));
}*/
/*#include<iostream>
#include<vector>
using namespace std;
vector<int> x = { 12,4,5,15 }, v;
int n, m;
void comb(int k)
{
	if (k == m + 1)
	{
		for (int i = 1;i <= m;i++)
			cout << x[v[i] - 1] << " ";
		cout << endl;
	}
	else
		for (int i = v[k - 1] + 1;i <= n;i++)
		{
			v[k] = i;
			comb(k + 1);
		}
}
int main()
{
	n = x.size();
	cin >> m;
	v.resize(m + 1);
	comb(1);
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
#include<set>
using namespace std;
ifstream fin("pluricex.in");
ofstream fout("pluricex.out");
int d, n, k;
vector<int> v;
vector<vector<int> > M;
set<int> S;
void sol()
{
	S.clear();
	for (int i = 1;i <= k;i++)
		for (auto t : M[v[i]])
			S.insert(t);
	if (S.size() == d)
	{
		for (int i = 1;i <= k;i++)
			fout << v[i] << " ";
		fout << '\n';
	}
}
void Comb(int p)
{
	if (p == k + 1)
	{
		sol();
	}
	else
		for (int i = v[p - 1] + 1;i <= n;i++)
		{
			v[p] = i;
			Comb(p + 1);
		}
}
int main()
{
	int t, y;
	fin >> n >> k >> d;
	vector<int> x;
	x.push_back(0);
	M.push_back(x);
	for (int i = 1;i <= n;i++)
	{
		fin >> t;
		x.clear();
		for (int j = 1;j <= t;j++)
		{
			fin >> y;
			x.push_back(y);
		}
		M.push_back(x);
	}
	v.resize(d + 1);
	Comb(1);
}*/
/*#include<iostream>
#include<string>
using namespace std;
int main()
{
	string text;
	getline(cin, text);
	int i = 0;
	while (i < text.size())
	{
		if (text[i] == '-')
		{
			text.erase(i, 1);
			while (isdigit(text[i]) or text[i] == ',')
				text.erase(i, 1);
		}
		else
			i++;
	}
	cout << text;
}*/
/*#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	char x[100];
	cin.getline(x, 100);
	int i = 0;
	while (i < strlen(x))
	{
		if (x[i] == '-')
		{
			strcpy(x + i, x + i + 1);
			while (isdigit(x[i]) or x[i] == ',')
				strcpy(x + i, x + i + 1);
		}
		else
			i++;
	}
	cout << x;
}*/
/*#include<iostream>
#include<string>
using namespace std;
int main()
{
	string text, cuvant;
	getline(cin, text);
	text += " ";
	int i = 0, first = 0, last;
	while (i < text.length())
	{
		if (text[i] == ' ')
		{
			last = i;
			cuvant = text.substr(first, last - first);
			first = i + 1;
			cout << cuvant << endl;
		}
		i++;
	}
}*/

//Divide et impera
/*#include<iostream>
using namespace std;
void DEI(int st, int dr)
{
	int m = (st + dr) / 2;
	if (st < dr)
	{
		cout << m << " ";
		DEI(st, m);
		DEI(m + 1, dr);
	}
}
int DEI1(int st, int dr)
{
	int m = (st + dr) / 2;
	if (st == dr)
		return m;
	else
		return DEI1(st, m) + DEI1(m + 1, dr);
}
int main()
{
	int n;
	cin >> n;
	cout << DEI1(1, n) << " ";
}*/
/*#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n;
vector<int> v;
void Citire()
{
	int i;
	cin >> n;
	v.resize(n);
	for (i = 0; i < n; i++)
		cin >> v[i];
}
int DEI_suma(int st, int dr)
{
	int m = (st + dr) / 2;
	if (st == dr)
		return v[m];
	else
		return DEI_suma(st, m) + DEI_suma(m + 1, dr);
}
int DEI_max(int st, int dr)
{
	int m = (st + dr) / 2, m1, m2;
	if (st == dr)
		return v[m];
	else
	{
		m1 = DEI_max(st, m);
		m2 = DEI_max(m + 1, dr);
		if (m1 > m2)
			return m1;
		else
			return m2;
	}
}
int DEI_prpar(int st, int dr)
{
	int m = (st + dr) / 2;
	if (st == dr)
	{
		if (v[m] % 2 == 0)
			return v[m];
		else
			return 1;
	}
	else
		return DEI_prpar(st, m) * DEI_prpar(m + 1, dr);
}
bool DEI_binary(int st, int dr, int x)
{
	int m = (st + dr) / 2;
	if (st > dr)
		return 0;
	else
		if (v[m] == x)
			return 1;
		else
			if (x < v[m])
				return DEI_binary(st, m - 1, x);
			else
				return DEI_binary(m + 1, dr, x);
}
int main()
{
	Citire();
	sort(v.begin(), v.end());
	int x;
	cin >> x;
	cout << DEI_binary(0, n - 1, x);
}*/

//Suma si produs
/*#include<iostream>
#include<string>
#include<vector>
using namespace std;
void suma(string a, string b, string& s)
{
	int la = a.length(), lb = b.length();
	int t = max(la, lb) + 1;
	int minte = 0;
	vector<int> va(t, 0), vb(t, 0), suma(t, 0);
	for (int i = la - 1;i >= 0;i--)
		va[la - i - 1] = a[i] - '0';
	for (int i = lb - 1;i >= 0;i--)
		vb[lb - i - 1] = b[i] - '0';
	for (int i = 0;i < t;i++)
	{
		int sm = va[i] + vb[i] + minte;
		suma[i] = sm % 10;
		minte = sm / 10;
	}
	if (suma[t - 1] == 0)
	{ 
		t--;
		suma.pop_back();
	}
	for (int i = t - 1;i >= 0;i--)
		s.push_back(suma[i] + '0');
}
int main()
{
	string a, b, s;
	getline(cin, a);
	getline(cin, b);
	suma(a, b, s);
	cout << s;
}*/
/*#include<iostream>
#include<string>
#include<vector>
using namespace std;
void prod_cifra(string a, short c)
{
	int la = a.length();
	vector<int> va(la + 1, 0), p(la + 1, 0);
	int minte = 0, i;
	for (i = la - 1;i >= 0;i--)
		va[la - i - 1] = a[i] - '0';
	for (i = 0;i <= la;i++)
	{
		int s = minte + va[i] * c;
		p[i] = s % 10;
		minte = s / 10;
	}
	if (p[la] == 0)
	{
		p.pop_back();
		la--;
	}
	for (i = la;i >= 0;i--)
		cout << p[i];
}
int main()
{
	string a;
	short c;
	getline(cin, a);
	cin >> c;
	prod_cifra(a, c);
}*/
/*#include<iostream>
#include<string>
#include<vector>
using namespace std;
void produs(string a, string b, string& c)
{
	int la = a.length(), lb = b.length();
	int t = la + lb;
	int minte = 0;
	vector<int> va(t, 0), vb(t, 0), p(t, 0);
	for (int i = la - 1;i >= 0;i--)
		va[la - i - 1] = a[i] - '0';
	for (int i = lb - 1;i >= 0;i--)
		vb[lb - i - 1] = b[i] - '0';
	for (int i = 0;i < la;i++)
		for (int j = 0;j < lb;j++)
			p[i + j] += va[i] * vb[j];
	for (int i = 0;i < t;i++)
	{
		int s = minte + p[i];
		p[i] = s % 10;
		minte = s / 10;
	}
	if (p[t - 1] == 0)
	{
		t--;
		p.pop_back();
	}
	for (int i = t - 1;i >= 0;i--)
		cout << p[i];
}
int main()
{
	string a, b, c;
	getline(cin, a);
	getline(cin, b);
	produs(a, b, c);
}*/

//Impartire
	/*#include<iostream>
#include<string>
#include<vector>
using namespace std;
int rest(string& a, int b)
{
	int la = a.size(), r = 0;
	vector<int> A(la + 1), rez;
	for (int i = 0;i < la;i++)
		A[i] = a[i] - '0';
	for (int i = 0;i < la;i++)
	{
		r = r * 10 + A[i];
		rez.push_back(r / b);
		r %= b;
	}
	while (rez[0] == 0)
		rez.erase(rez.begin());
	int rsz = rez.size();
	for (int i = 0;i < rsz;i++)
		cout << rez[i];
	cout << endl;
	return r;
}
int main()
{
	string a;
	int b;
	getline(cin, a);
	cin >> b;
	cout << rest(a, b);
}*/
//Aritmetica modulara
/*#define MOD 100007
#include<iostream>
using namespace std;
int main()
{
	int n, sum = 0;
	cin >> n;
	for (int i = 1;i <= n;i++)
		sum = (sum + i) % MOD;
	cout << sum;
}*/
/*#include<iostream>
using namespace std;
#define MOD 100007
int main()
{
	unsigned long long n;
	int p = 1;
	cin >> n;
	for (unsigned long long i = 1;i <= n;i++)
		p = (p * i) % MOD;
	cout << p;
}*/
/*#include<iostream>
using namespace std;
#define MOD 2000005
int main()
{
	unsigned long long a, b;
	cin >> a >> b;
	int s = 0;
	for (unsigned long long i = 1;i <= a;i++)
		s = (s + b) % MOD;
	cout << s;
}*/
/*#include<iostream>
using namespace std;
#define MOD 300007
int main()
{
	unsigned long long n, m;
	cin >> n >> m;
	int p = 1;
	for (unsigned long long i = 1;i <= n;i++)
		p = (p * m) % MOD;
	cout << p;
}*/
//Arnjamente de n liate de cate m
/*#include <iostream>
using namespace std;
#define MOD 300007
int main()
{
	long long int n, m, p = 1;
	cin >> n >> m;
	for (long long int i = n - m + 1; i <= n; ++i)
		p = (p * i) % MOD;
	cout << p << '\n';
}*/
//Combinari de n luate cate m
/*#include<iostream>
#include<vector>
using namespace std;
#define MOD 300007
int main()
{
	int n, m;
	cin >> n >> m;
	vector<vector<int>> Pascal(n + 1);
	for (int i = 0;i <= n;i++)
		Pascal[i].resize(i + 1);
	Pascal[0][0] = 1;
	for (int i = 1;i <= n;i++)
	{
		Pascal[i][0] = 1;
		Pascal[i][i] = 1;
		for (int j = 1;j < i;j++)
			Pascal[i][j] = (Pascal[i - 1][j] + Pascal[i - 1][j - 1]) % MOD;
	}
	cout << Pascal[n][m];
}*/

/*#include<iostream>
#include<fstream>
#include<string>
using namespace std;
ifstream fin("caps.in");
ofstream fout("caps.out");
string next(string text)
{
	int sz = text.size();
	for (int i = 0;i < sz;i++)
		if (islower(text[i]))
			text[i] = toupper(text[i]);
		else
			text[i] = tolower(text[i]);
	return text;
}
int main()
{
	int k, q, c, nr;
	fin >> k >> q;
	fin.get();
	string text;
	getline(fin, text);
	for (int i = 1;i <= q;i++)
	{
		nr = 0;
		fin >> c;
		c--;
		while (text.size() < c)
			text += next(text);
		fout << text[c] << " ";
		for (int j = 0;j <= c;j++)
			if (text[j] == text[c])
				nr++;
		fout << nr << endl;
	}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("rover.in");
ofstream fout("rover.out");
int n, g;
vector<vector<int>> M, K;
void rsz()
{
	M.resize(n + 2);
	K.resize(n + 2);
	for (int i = 0;i <= n + 1;i++)
		M[i].resize(n + 2);
	for (int i = 0;i <= n + 1;i++)
		K[i].resize(n + 2);
}
void board()
{
	for (int i = 0;i <= n + 1;i++)
		K[i][0] = K[i][n + 1] = -1;
	for (int j = 0;j <= n + 1;j++)
		K[0][j] = K[n + 1][j] = -1;
}
void print()
{
	for (int i = 1;i <= n;i++)
	{
		for (int j = 1;j <= n;j++)
			cout << K[i][j] << " ";
		cout << endl;
	}
}
void read()
{
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= n;j++)
			fin >> M[i][j];
}
void Lee()
{
	queue<pair<int, int>> Q;
	pair<int, int> element;
	vector<int> di = { 1,0,0,-1 };
	vector<int> dj = { 0,1,-1,0 };
	Q.push({ 1,1 });
	int val = 1;
	K[1][1] = 1;
	while (!Q.empty() and K[n][n] == 0)
	{
		element = Q.front();
		Q.pop();
		val++;
		for (int i = 0;i <= 3;i++)
			if (K[element.first + di[i]][element.second + dj[i]] == 0)
			{
				K[element.first + di[i]][element.second + dj[i]] = val;
				Q.push({ element.first + di[i],element.second + dj[i] });
			}
	}
}
int main()
{
	int v;
	fin >> v;
	fin >> n;
	rsz();
	board();
	if (v == 1)
	{
		fin >> g;
		read();
		Lee();
		print();
	}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("sir.in");
ofstream fout("sir.out");
vector<int> v;
int nr = 0;
bool vf(int n)
{
	int val = v[0];
	for (int i = 1;i < n;i++)
		if (val != v[i])
			return 1;
	return 0;
}
void Bkt(int n, int x, int k)
{
	if (k == n - 1)
	{
		if (vf(n))
			nr++;
	}
	else
		for (int i = 1;i < x;i++)
		{
			v[k] = i;
			Bkt(n, x, k + 1);
		}
}
int main()
{
	int p, n, x;
	fin >> p >> n >> x;
	v.resize(n);
	v[0] = 1;
	v[n - 2] = x;
	if (p == 1)
	{
		Bkt(n, x, 0);
		fout << nr;
	}
}*/

//Exponentiere rapida
/*#include<iostream>
using namespace std;
#define ull unsigned long long
ull putere(int a, int exp)
{
	ull p = 1;
	while (exp)
		if (exp % 2 == 1)
		{
			p *= a;
			exp--;
		}
		else
		{
			a *= a;
			exp /= 2;
		}
	return p;
}
int main()
{
	int a, exp;
	cin >> a >> exp;
	cout << putere(a, exp);
}*/
/*#include<iostream>
using namespace std;
#define ull unsigned long long
#define MOD 1000000007
ull putere(int a, int exp)
{
	ull p = 1;
	while (exp)
	{
		if (exp % 2 == 1)
			p *= a;
		exp /= 2;
		a *= a;
	}
	return p;
}
int main()
{
	int a, exp;
	cin >> a >> exp;
	cout << putere(a, exp);
}*/
/*#include<iostream>
using namespace std;
#define ull unsigned long long
#define MOD 1000000007
ull putere(int a, int exp)
{
	ull p = 1;
	while (exp)
	{
		if (exp % 2 == 1)
			p = (p * a) % MOD;
		exp /= 2;
		a = (a * a) % MOD;
	}
	return p;
}
int main()
{
	int a, exp;
	cin >> a >> exp;
	cout << putere(a, exp);
}*/
/*#include<iostream>
#include<climits>
using namespace std;
#define MOD 1000000007
int putere(int x, int y)
{
	int p = 1;
	while (y)
	{
		if (y % 2 == 1)
			p = (p * x) % MOD;
		y /= 2;
		x = (x * x) % MOD;
	}
	return p;
}
int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	cout << putere(a, putere(b, c));
}*/
//Algoritmul lui Euclid
/*#include<iostream>
using namespace std;
void Cmmdc(int a, int b, int& c)
{
	if (b == 0)
		c = a;
	else
		Cmmdc(b, a % b, c);
}
int main()
{
	int c;
	Cmmdc(242, 2000002, c);
	cout << c;
}*/
/*#include<iostream>
using namespace std;
void Cmmdc_ext(int a, int b, int& c, int& x, int& y)
{
	int x1, y1;
	if (b == 0)
	{
		c = a;
		x = 1;
		y = 1;
	}
	else
	{
		Cmmdc_ext(b, a % b, c, x1, y1);
		x = y1;
		y = x1 - (a / b) * y1;
	}
}
int main()
{
	int a, b, c, x, y;
	cin >> a >> b;
	Cmmdc_ext(a, b, c, x, y);
	cout << x << " " << y;
}*/
//Invers modular
/*#include<iostream>
using namespace std;
void Cmmdc_ext(int a, int MOD, int& x, int& y)
{
	int x1, y1;
	if (MOD == 0)
	{
		x = 1;
		y = 1;
	}
	else
	{
		Cmmdc_ext(MOD, a % MOD, x1, y1);
		x = y1;
		y = x1 - (a / MOD) * y1;
	}
}
int main()
{
	int a, MOD, x, y;
	cin >> a >> MOD;
	Cmmdc_ext(a, MOD, x, y);
	while (x < 0)
		x += MOD;
	cout << x;
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
#define MOD 1000000007
ifstream fin("dorel.in");
ofstream fout("dorel.out");
int C(int b, int c)
{
	int nr = 0;
	vector<int> v(c);
	for (int i = c - 1;i >= 0 and b;i--)
	{
		v[i] = b;
		b--;
	}
	do
	{
		nr = (nr + 1) % MOD;
	} while (next_permutation(v.begin(), v.end()));
	return nr;
}
int main()
{
	int b, c, k, t;
	fin >> t;
	for (int i = 0;i < t;i++)
	{
		fin >> b >> c >> k;
		if (b > k or c > k)
			fout << 0 << endl;
		else
			fout << C(b, c) << endl;
	}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("egale.in");
ofstream fout("egale.out");
bool vf(int l, int r, vector<int> V)
{
	for (int i = l;i < r;i++)
		if (V[i] != V[i + 1])
			return 0;
	return 1;
}
int main()
{
	int n, q;
	fin >> n >> q;
	vector<int> V(n + 1);
	for (int i = 1;i <= n;i++)
		fin >> V[i];
	int l, r, v;
	bool ok;
	for (int i = 0;i < q;i++)
	{
		fin >> l >> r >> v;
		ok = vf(l, r, V);
		if (ok)
		{
			if (v == 0)
			{
				if (v == V[l])
					fout << 0 << endl;
				else
					fout << 1 << endl;
			}
			else
				if (v < V[l])
					fout << v + 1 << endl;
				else
					fout << v - V[l] << endl;
		}
		else
		{
			if (v == 0)
				fout << 1 << endl;
			else
				fout << v + 1 << endl;
		}
	}
}*/

/*#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
string solve1()
{
	string text;
	getline(cin, text);
	int sz = text.size();
	string voc = "aeiouAEIOU";
	for (int i = sz - 1;i >= 0;i--)
		if (voc.find(text[i]) == string::npos)
		{
			text.erase(i, 1);
			return text;
		}
	return text;
}
string solve2()
{
	string text1, text2, sufix;
	getline(cin, text1);
	getline(cin, text2);
	int i = text1.size(), j = text2.size();
	while (i != 0 and j != 0)
	{
		i--;
		j--;
		if (text1[i] == text2[j])
			sufix.insert(0, 1, text1[i]);
		else
			break;
	}
	if (sufix.begin() != sufix.end())
		return sufix;
	else
		return "NU EXISTA";
}
void solve4()
{
	string text, word;
	getline(cin, text);
	int val = text.find('*');
	word = text.substr(0, val);
	text.erase(0, val);
	val = text.find(word);
	while (val != string::npos)
	{
		if (!islower(text[val - 1]) and !isupper(text[val - 1]))
			text.erase(val, word.size());
		val = text.find(word, val + 1);
	}
	cout << text;
}
bool Comp(pair<string, string>a, pair<string, string> b)
{
	if (a.first == b.first)
		return a.second < b.second;
	return a.first < b.first;
}
void name_sort()
{
	vector<pair<string, string>> v(5);
	string text;
	int f;
	for (int i = 0;i < 5;i++)
	{
		cin >> v[i].first >> v[i].second;
		v[i].first[0] = toupper(v[i].first[0]);
	}
	sort(v.begin(), v.end(), Comp);
	for (int i = 0;i < 5;i++)
		cout << v[i].first << " " << v[i].second << endl;
}
void solve5()
{
	string text, word;
	getline(cin, text);
	int sz = text.length();
	for (int i = 0;i < sz;i++)
	{
		word = text;
		word.erase(i, 1);
		cout << word << endl;
	}
}
int main()
{
	name_sort();
}*/
/*#include<iostream>
#include<fstream>
#include<set>
using namespace std;
ifstream fin("numere.in");
pair<bool, short> max_c(int n)
{
	short c = 0;
	while (n)
	{
		if (c < n % 10)
			c = n % 10;
		n /= 10;
	}
	return { c % 2 == 1,c };
}
int main()
{
	int x, y;
	pair<bool, short> a, b;
	multiset<pair<int, short> > S;
	multiset<pair<int, short> >::iterator t;
	while (fin >> x >> y)
	{
		a = max_c(x);
		b = max_c(y);
		if (a.first)
			S.insert({ x,a.second });
		if (b.first)
			S.insert({ y,b.second });
	}
	for (t = S.begin();t != S.end();t++)
		cout << (*t).first << " " << (*t).second << endl;
}*/
/*#include<iostream>
#include<fstream>
#include<set>
using namespace std;
ifstream fin("numere.in");
bool Comp(pair<int, int> a, pair<int, int> b)
{
	if (a.first == b.first)
		return a.second > b.second;
	return a.first > b.first;
}
int main()
{
	int x, y;
	multiset<pair<int, int>, bool(*)(pair<int, int>, pair<int, int>) > S(Comp);
	while (fin >> x >> y)
		S.insert({ x,y });
	multiset<pair<int, int> >::iterator t;
	for (t = S.begin();t != S.end();t++)
		cout << (*t).first << " " << (*t).second << endl;
}*/
/*#include<iostream>
#include<fstream>
#include<set>
using namespace std;
ifstream fin("numere.in");
int main()
{
	multiset < pair<pair<int, int>, int> > S;
	multiset < pair<pair<int, int>, int> >::iterator t;
	int x, y;
	while (fin >> x >> y)
		S.insert({ {x,y},y - x + 1 });
	pair<pair<int, int>, int> w = *S.rbegin();
	S.erase(*S.rbegin());
	for (t = S.begin();t != S.end();t++)
		if ((*t).second == w.second)
			cout << (*t).first.first << " " << (*t).first.second << endl;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<set>
using namespace std;
ifstream fin("numere.in");
set<int> cifre(int x)
{
	set<int> C;
	while (x)
	{
		C.insert(x % 10);
		x /= 10;
	}
	return C;
}
int main()
{
	set<pair<set<int>, int> > S;
	set<pair<set<int>, int> >::iterator t;
	int x;
	set<int> C;
	while (fin >> x)
	{
		C = cifre(x);
		S.insert({ C,x });
	}
	set<int> Q = {};
	for (t = S.begin();t != S.end();t++)
		if (Q != (*t).first)
		{
			Q = (*t).first;
			if (t != S.begin())
				cout << endl;
			cout << (*t).second << " ";
		}
		else
			cout << (*t).second << " ";
}*/

//Bkt
/*#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
vector<bool> folosit;
int n;
void Bkt(int k)
{
	if (k == n + 1)
	{
		for (int i = 1;i <= n;i++)
			cout << v[i] << " ";
		cout << endl;
	}
	else
		for (int i = 1;i <= n;i++)
		{
			v[k] = i;
			if (folosit[i] == 0)
			{
				folosit[i] = 1;
				Bkt(k + 1);
				folosit[i] = 0;
			}
		}
}
int main()
{
	cin >> n;
	v.resize(n + 1);
	folosit.resize(n + 1);
	Bkt(1);
}*/
//Aranjamente
/*#include<iostream>
#include<vector>
using namespace std;
int n, m;
vector<int> v;
vector<bool> folosit;
void Prm(int k)
{
	if (k == m + 1)
	{
		for (int i = 1;i <= m;i++)
			cout << v[i] << " ";
		cout << endl;
	}
	else
		for (int i = 1;i <= n;i++)
		{
			v[k] = i;
			if (folosit[i] == 0)
			{ 
				folosit[i] = 1;
				Prm(k + 1);
				folosit[i] = 0;
			}
		}
}
int main()
{
	cin >> n >> m;
	v.resize(m + 1);
	folosit.resize(n + 1);
	Prm(1);
}*/
//Combinari
/*#include<iostream>
#include<vector>
using namespace std;
int n, m;
vector<int> v;
void Comb(int k)
{
	if (k == m + 1)
	{
		for (int i = 1;i <= m;i++)
			cout << v[i] << " ";
		cout << endl;
	}
	else
		for (int i = v[k - 1] + 1;i <= n;i++)
		{
			v[k] = i;
			Comb(k + 1);
		}
}
int main()
{
	cin >> n >> m;
	v.resize(m + 1);
	Comb(1);
}*/

/*#include<iostream>
#include<vector>
using namespace std;
void C(int n, int m)
{
	vector<int> v1 = { 1,1 }, v2;
	for (int i = 1;i <= n;i++)
	{
		v2 = { 1 };
		for (int j = 1;j < i;j++)
			v2.push_back(v1[j] + v1[j - 1]);
		v2.push_back(1);
		v1 = v2;
	}
	cout << v2[m];
}
int main()
{
	int n, m;
	cin >> n >> m;
	C(n, m);
}*/

//Pointers
/*#include<iostream>
using namespace std;
int main()
{
	int a, * p;
	a = 6;
	p = &a;
	*p = 18;
	cout << a << endl;
	a = 24;
	cout << *p;
}*/
/*#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
using namespace std;
int main()
{
	int n, * v;
	scanf("%d", &n);
	v = new int[n];
	for (int i = 0;i < n;i++)
		scanf("%d", v + i);
	for (int i = 0;i < n;i++)
		printf("%d ", *(v + i));
}*/
/*#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
using namespace std;
int main()
{
	int n, * v, * p;
	scanf("%d", &n);
	v = new int[n];
	for (p = v;p - v < n;p++)
		scanf("%d", p);
	for (p = v;p - v < n;p++)
		printf("%d ", *p);
}*/
/*#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
int* search(int* v, int n, int x)
{
	int* p = v;
	while (p - v < n and *p != x)
		p++;
	if (p - v >= n)
		return NULL;
	return  p;
}
int main()
{
	int n, * v, x;
	scanf("%d", &n);
	v = new int[n];
	for (int* p = v;p - v < n;p++)
		scanf("%d", p);
	scanf("%d", &x);
	if (search(v, n, x) == NULL)
		printf("Nu exista");
	else
		printf("%d", *search(v, n, x));
}*/
/*#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
void Union(int* v, int* n, int* w, int m)
{
	int* p = v + *n, * q = w;
	for (int i = 0;i < m;i++)
		*(p + i) = *(q + i);
	*n += m;
}
int main()
{
	int n, m, * v, * w;
	scanf("%d", &n);
	v = new int[n];
	for (int* p = v;p - v < n;p++)
		scanf("%d", p);
	scanf("%d", &m);
	w = new int[m];
	for (int* p = w;p - w < m;p++)
		scanf("%d", p);
	Union(v, &n, w, m);
	for (int* p = v;p - v < n;p++)
		printf("%d ", *p);
}*/

//Liste simple inlantuite dinamic
/*#include<iostream>
using namespace std;
struct Nod
{
	int val;
	Nod* adr;
};
int main()
{
	Nod* a, * b, * c, * d;
	a = new Nod;
	b = new Nod;
	c = new Nod;
	d = new Nod;
	a->val = 5;
	a->adr = b;
	b->val = 1;
	b->adr = c;
	c->val = 8;
	c->adr = d;
	d->val = 10;
	d->adr = NULL;
	for (Nod* p = a;p;p = p->adr)
		cout << p->val << " ";
}*/
/*#include<iostream>
using namespace std;
struct Nod
{
	int val;
	Nod* adr;
};
int main()
{
	Nod* first, * last, * crt;
	int n, x;
	cin >> n;
	first = last = 0;
	for (int i = 1;i <= n;i++)
	{
		cin >> x;
		crt = new Nod;
		crt->val = x;
		crt->adr = 0;
		if (first == 0)
			first = crt;
		else
			last->adr = crt;
		last = crt;
	}
	for (Nod* p = first;p;p = p->adr)
		cout << p->val << " ";
}*/
/*#include<iostream>
using namespace std;
struct NOD
{
	int val;
	NOD* adr;
};
int main()
{
	NOD* first, * last, * crt;
	int n, x;
	cin >> n;
	first = last = 0;
	for (int i = 1;i <= n;i++)
	{
		cin >> x;
		crt = new NOD;
		crt->val = x;
		crt->adr = 0;
		if (!first)
			first = crt;
		else
			last->adr = crt;
		last = crt;
	}
	int max = first->val;
	for (NOD* p = first;p;p = p->adr)
		if (max < p->val)
			max = p->val;
	cout << max;
}*/
/*#include<iostream>
using namespace std;
struct NOD
{
	int val;
	NOD* adr;
};
int main()
{
	NOD* first, * last, * crt;
	int n, x;
	cin >> n;
	first = last = 0;
	for (int i = 1;i <= n;i++)
	{
		cin >> x;
		crt = new NOD;
		crt->val = x;
		crt->adr = 0;
		if (!first)
			first = crt;
		else
			last->adr = crt;
		last = crt;
	}
	int nr = 0;
	NOD* second = first->adr;
	for (NOD* p = second;p;p = p->adr)
		if (p->val == first->val)
			nr++;
	cout << nr;
}*/
/*#include<iostream>
using namespace std;
struct NOD
{
	int val;
	NOD* adr;
};
int main()
{
	NOD* first, * last, * crt;
	int n, x;
	cin >> n;
	first = last = 0;
	for (int i = 1;i <= n;i++)
	{
		cin >> x;
		crt = new NOD;
		crt->val = x;
		crt->adr = 0;
		if (!first)
			first = crt;
		else
			last->adr = crt;
		last = crt;
	}
	for (NOD* p = first;p != last;p = p->adr)
		if (p->val < last->val)
			cout << p->val << " ";
}*/
/*#include<iostream>
using namespace std;
struct NOD
{
	int val;
	NOD* adr;
};
void push_back(NOD* &first, NOD* &last, int x)
{
	NOD* crt;
	crt = new NOD;
	crt->val = x;
	crt->adr = 0;
	if (!first)
		first = crt;
	else
		last->adr = crt;
	last = crt;
}
void print(NOD* first)
{
	for (NOD* p = first;p;p = p->adr)
		cout << p->val << " ";
}
void pop_front(NOD*& first)
{
	NOD* p = first;
	first = first->adr;
	delete p;
}
int main()
{
	NOD* first, * last;
	int n, x;
	cin >> n;
	first = last = 0;
	for (int i = 1;i <= n;i++)
	{
		cin >> x;
		push_back(first, last, x);
	}
	if(first)
		pop_front(first);
	print(first);
}*/

//My_Stack
/*#include<iostream>
using namespace std;
struct Stack
{
	int val;
	Stack* adr;
};
void Push(Stack* &first, int x)
{
	Stack* crt;
	crt = new Stack;
	crt->val = x;
	crt->adr = first;
	first = crt;
}
void Pop(Stack* &first)
{
	Stack* p;
	p = first;
	first = first->adr;
	delete p;
}
bool isEmpty(Stack* first)
{
	return !first;
}
int Top(Stack* first)
{
	return first->val;
}
int main()
{
	Stack* first = 0;
	int n, x;
	cin >> n;
	for (int i = 0;i < n;i++)
	{
		cin >> x;
		Push(first, x);
	}
	while (!isEmpty(first))
	{
		cout << Top(first) << " ";
		Pop(first);
	}
}*/
/*#include<iostream>
using namespace std;
struct Stack
{
	char val;
	Stack* adr;
};
void Push(Stack*& first, int x)
{
	Stack* crt;
	crt = new Stack;
	crt->val = x;
	crt->adr = first;
	first = crt;
}
void Pop(Stack*& first)
{
	Stack* p;
	p = first;
	first = first->adr;
	delete p;
}
bool isEmpty(Stack* first)
{
	return !first;
}
char Top(Stack* first)
{
	return first->val;
}
int main()
{
	Stack* crt, * first, * p;
	int i, n, x;
	char a;
	first = 0;
	cin >> n;
	for (i = 1; i <= n; i++)
	{
		cin >> a;
		if (!isEmpty(first))
		{
			if (a == ')' and first->val == '(')
				Pop(first);
			else
				Push(first, a);
		}
		else
			Push(first, a);
	}
	if (isEmpty(first) == 0)
		cout << "NU";
	else
		cout << "DA";
}*/

//Tema pregatire
/*#include<iostream>
using namespace std;
int main()
{
	int n, m;
	cin >> n >> m;
	int x = n, y = m;
	while (m and n > 1)
	{
		n -= 2;
		m--;
	}
	cout << n << " ";
	if (x - 1 <= y)
		cout << 0;
	else
		cout << x - 1 - y;
}*/
/*#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int n, m, k, x, y;
	cin >> n >> m >> k;
	vector<vector<int>> M(n + 1);
	for (int i = 0;i < m;i++)
	{
		cin >> x >> y;
		M[x].push_back(y);
	}
	int nr = 0;
	for (int i = 1;i <= n;i++)
		if (i % k != 0)
		{
			int sz = M[i].size();
			for (int j = 0;j < sz;j++)
				if (M[i][j] % k != 0)
					nr++;
		}
	cout << nr;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<set>
using namespace std;
ifstream fin("subgraf.in");
ofstream fout("subgraf.out");
bool isprime(int k)
{
	if (k == 1)
		return 0;
	if (k == 2)
		return 1;
	if (k % 2 == 0)
		return 0;
	for (int i = 3;i < k / 2;i++)
		if (k % i == 0)
			return 0;
	return 1;
}
int main()
{
	int n, x, y, nr = 0;
	fin >> n;
	vector<set<int> > M(n + 1);
	while (fin >> x >> y)
		if (x < y)
			M[x].insert(y);
		else
			M[y].insert(x);
	for (int i = 1;i <= n;i++)
		if (!isprime(i))
			for (auto t : M[i])
				if (!isprime(t))
					nr++;
	fout << nr;
}*/

//Graph
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
#define ULL unsinged long long
ifstream fin("graf.in");
int n, m;
vector<pair<vector<int>, int> > G;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	for (int i = 0;i < m;i++)
	{
		fin >> x >> y;
		G[x].first.push_back(y);
		G[y].first.push_back(x);
		G[x].second++;
		G[y].second++;
	}
}
void print()
{
	for (int i = 1;i <= n;i++)
	{
		cout << i << " : ";
		int sz = G[i].first.size();
		for (int j = 0;j < sz;j++)
			cout << G[i].first[j] << " ";
		cout << endl;
	}
}
int main()
{
	read();
	print();
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<map>
using namespace std;
vector<vector<int> > G;
vector<int> lant;
int n, m, vf;
map<int, int> M;
map<pair<int, int>, int > M1;
void ReadGraph()
{
	int x, y, i;
	ifstream fin("graf.in");
	fin >> n >> m;
	G.resize(n + 1);
	for (i = 1; i <= m; i++)
	{
		fin >> x >> y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	fin >> vf;
	lant.resize(vf);
	for (i = 0; i < vf; i++)
	{
		fin >> lant[i];
		M[lant[i]]++;
		if (i > 0)
			M1[{lant[i], lant[i - 1]}]++;
	}
}
bool Elementar()
{
	for (auto x : M)
		if (x.second > 1)
			return 0;
	return 1;
}
bool Lant()
{
	for (auto i = 0; i < vf - 1; i++)
		if (find(G[lant[i]].begin(), G[lant[i]].end(), lant[i + 1]) ==
			G[lant[i]].end())
			return 0;
	return 1;
}
void WriteGraph()
{
	int i, j;
	for (i = 1; i <= n; i++)
	{
		cout << i << ": ";
		for (j = 0; j < G[i].size(); j++)
			cout << G[i][j] << " ";
		cout << endl;
	}
}
bool Ciclu()
{
	if (vf < 3)
		return 0;
	if (!Lant())
		return 0;
	if (lant[0] != lant[vf - 1])
		return 0;
	for (auto t : M1)
		if (t.second > 1)
			return 0;
	return 1;
}
int main()
{
	ReadGraph();
	if (Lant() == 1)
	{
		cout << "Lant ";
		if (Elementar())
			cout << "elementar" << endl;
		else
			cout << "neelementar" << endl;
	}
	else
		cout << "Nu e lant" << endl;
	if (Ciclu())
		cout << "E ciclu";
	else
		cout << "Nu e ciclu";
		}*/

/*#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
int main()
{
	int n, m;
	cin >> n;
	string name, game;
	map<string, vector<string> > M;
	for (int i = 0;i < n;i++)
	{
		cin >> name >> m;
		for (int j = 0;j < m;j++)
		{
			cin >> game;
			M[game].push_back(name);
		}
	}
	cin >> game;
	cout << M[game].size();
}*/
/*#include<iostream>
#include<fstream>
#include<string>
#include<map>
using namespace std;
int main()
{
	ifstream fin("graf.in");
	string word, cuvant;
	map<string, short> M;
	int m = 0;
	while (cin >> word)
	{
		M[word]++;
		if (m < M[word])
		{
			m = M[word];
			cuvant = word;
		}
	}
	cout << cuvant;
}*/
//Graph
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
int n, m, start;
vector<vector<int> > G;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	for (int i = 0;i < m;i++)
	{
		fin >> x >> y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void Breadth_first(int start)
{
	queue<int> Q;
	vector<int> viz(n + 1);
	Q.push(start);
	viz[start] = 1;
	int crt, sz;
	while (!Q.empty())
	{
		crt = Q.front();
		Q.pop();
		cout << crt << " ";
		sz = G[crt].size();
		for (int j = 0;j < sz;j++)
			if (viz[G[crt][j]] == 0)
			{
				Q.push(G[crt][j]);
				viz[G[crt][j]] = 1;
			}
	}
}
int main()
{
	read();
	Breadth_first(1);
}*/

//Exercitii
/*#include<fstream>
#include<cmath>
using namespace std;
ifstream fin("bomboane.in");
ofstream fout("bomboane.out");
int main()
{
	int c, n, x, y;
	fin >> c >> n >> x >> y;
	if (c == 1)
		fout << n / x;
	else
		if (c == 2)
		{
			int X = 2;
			for (int i = 2;i <= n / 2;i++)
				if (n % i == 0)
				{
					X = i;
					break;
				}
			fout << n / X;
		}
		else
		{
			int B = 0, X = 0, r = n;
			for (int i = n / y;i >= x;i--)
				if (r > n % i and n / i >= y)
				{
					r = n % i;
					B = n / i;
					X = i;
					if (r == 0)
						break;
				}
			fout << r << " " << X << " " << B;
		}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("microbist.in");
ofstream fout("microbist.out");
int main()
{
	int c, n, x;
	pair<int, int> goal;
	fin >> c >> n;
	if (c == 1)
	{
		for (int i = 0;i < n;i++)
		{
			fin >> x;
			if (x == 1)
				goal.first++;
			else
				goal.second++;
		}
		
		fout << goal.first << " " << goal.second;
	}
	else
		if (c == 2)
		{
			int nr = 0;
			for (int i = 0;i < n;i++)
			{
				fin >> x;
				if (goal.first == goal.second)
					nr++;
				if (x == 1)
					goal.first++;
				else
					goal.second++;
			}
			if (goal.first == goal.second)
				nr++;
			fout << nr;
		}
		else
		{
			int lead, come_back = 0, max_come_back = 0;
			vector<pair<int, int> > v;
			for (int i = 0;i < n;i++)
			{
				fin >> x;
				if (v.empty())
					v.push_back({ 1,x });
				else
					if (v[v.size() - 1].second == x)
						v[v.size() - 1].first++;
					else
						v.push_back({ 1,x });
			}
			int sz = v.size();
			lead = v[0].second;
			if (v[0].second == 1)
				goal.first += v[0].first;
			else
				goal.second += v[0].first;
			for (int i = 1;i < sz;i++)
			{
				if (v[i].second == 1)
					goal.first += v[i].first;
				else
					goal.second += v[i].first;
				if (lead != v[i].second)
				{
					if (lead == 1)
					{
						if (goal.first < goal.second)
							come_back = goal.first - goal.second + v[i].first + 1;
						if (max_come_back < come_back)
							max_come_back = come_back;
						lead = 2;
					}
					else
					{
						if (goal.first > goal.second)
							come_back = goal.second - goal.first + v[i].first + 1;
						if (max_come_back < come_back)
							max_come_back = come_back;
						lead = 1;
					}
				}
			}
			fout << max_come_back;
		}
}*/

/*#include<iostream>
#include<fstream>
#include<unordered_map>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
ifstream fin("perechi.in");
ofstream fout("perechi.out");
int oglindit(int x)
{
	int o = 0;
	while (x)
	{
		o = o * 10 + x % 10;
		x /= 10;
	}
	return o;
}
string palindrom(string x)
{
	int sz = x.length();
	string rev = "";
	for (int i = sz - 1;i >= 0;i--)
		rev += x[i];
	return rev;
}
void print(unordered_map<int, int> M)
{
	for (auto t : M)
		cout << t.first << " " << t.second << " ";
	cout << endl;
}
bool crt(string a, string b)
{
	int sza = a.length(), szb = b.length();
	if (sza != szb)
		return sza > szb;
	return a > b;
}
int main()
{
	int c;
	fin >> c;
	if (c == 1)
	{
		int n, nr = 0, p, x;
		fin >> n;
		unordered_map<int, int> M;
		for (int i = 0;i < n;i++)
		{
			fin >> x;
			if (x % 10 != 0)
			{
				int og = oglindit(x);
				if (M.find(og) != M.end())
				{
					if (M[og] == 0)
						M[og] = 1;
					else
						M[og]++;
				}
			}
			if (M[x] == 0)
				M[x] = 0;
		}
		for (auto t : M)
			if(t.second)
			{
				//t.second++;
				nr += (t.second * (t.second + 1)) / 2;
			}
		fout << nr;
	}
	else
	{
		int n;
		fin >> n;
		vector<string> v(n);
		for (int i = 0;i < n;i++)
			fin >> v[i];
		sort(v.begin(), v.end(), crt);
		for (int i = 1;i <= 9;i++)
			v.pop_back();
		bool ok = 1;
		int sz = v.size();
		for (int i = 0;i < sz - 1 and ok;i++)
			for (int j = i + 1;j < sz and ok;j++)
				if (v[i] + v[j] == palindrom(v[i] + v[j]) and v[j] != "9")
				{
					fout << v[i] << v[j];
					ok = 0;
				}
				else
					if (v[j] + v[i] == palindrom(v[j] + v[i]) and v[j] != "9")
					{
						fout << v[j] << v[i];
						ok = 0;
					}
	}
}*/
/*#include<iostream>
#include<fstream>
std::ifstream fin("avid.in");
std::ofstream fout("avid.out");
int Cmmdc(int n, int m)
{
	while (m)
	{
		int r = n % m;
		n = m;
		m = r;
	}
	return n;
}
int div(int x)
{
	int nr = 1, e = 1;
	while (x % 2 == 0)
	{
		e++;
		x /= 2;
	}
	nr *= e;
	for (int i = 3;i * i <= x;i += 2)
	{
		e = 1;
		while (x % i == 0)
		{
			e++;
			x /= i;
		}
		nr *= e;
	}
	if (x > 1)
		nr *= 2;
	return nr;
}
int main()
{
	int n;
	short c, p;
	int nr = 0, cmmdc, DIVp;
	fin >> c >> n >> p;
	int x, y, z;
	fin >> x >> y;
	if (c == 1)
	{
		for (int i = 0;i < n - 2;i++)
		{
			fin >> z;
			cmmdc = Cmmdc(x, Cmmdc(y, z));
			DIVp = div(cmmdc);
			if (DIVp <= p)
				nr++;
			x = y;
			y = z;
		}
		fout << nr;
	}
	else
	{
		int maxy = 0, crt = 2;
		for (int i = 0;i < n - 2;i++)
		{
			fin >> z;
			cmmdc = Cmmdc(x, Cmmdc(y, z));
			DIVp = div(cmmdc);
			if (DIVp > p)
			{
				if (maxy < crt)
					maxy = crt;
				crt = 2;
			}
			else
				crt++;
			x = y;
			y = z;
		}
		if (crt > maxy)
			maxy = crt;
		fout << maxy;
	}
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<int> visited;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	visited.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void DST(int vf,int nr)
{
	queue<int> Q;
	Q.push(vf);
	int crt;
	visited[vf] = nr;
	while (!Q.empty())
	{
		crt = Q.front();
		Q.pop();
		int sz = G[crt].size();
		for (int j = 0;j < sz;j++)
			if (visited[G[crt][j]] == 0)
			{
				visited[G[crt][j]] = nr;
				Q.push(G[crt][j]);
			}
	}
}
int main()
{
	read();
	int nr = 0;
	for (int i = 1;i <= n;i++)
		if (visited[i] == 0)
		{
			nr++;
			DST(i, nr);
		}
	if (nr != 1)
		cout << "Neconex" << endl;
	for (int i = 1;i <= nr;i++)
		{
			cout << i << " : ";
			for (int j = 1;j <= n;j++)
				if (visited[j] == i)
					cout << j << " ";
			cout << endl;
		}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> visited;
vector<int> dst;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	visited.resize(n + 1);
	dst.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void DST(int vf)
{
	queue<int> Q;
	Q.push(vf);
	int crt;
	visited[vf] = 1;
	while (!Q.empty())
	{
		crt = Q.front();
		Q.pop();
		int sz = G[crt].size();
		for (int j = 0;j < sz;j++)
			if (visited[G[crt][j]] == 0)
			{
				visited[G[crt][j]] = 1;
				dst[G[crt][j]] = dst[vf] + 1;
				Q.push(G[crt][j]);
			}
	}
}
int main()
{
	read();
	DST(1);
	for (int i = 1;i <= n;i++)
		cout << dst[i] << " ";
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("parking.in");
ofstream fout("parking.out");
vector<vector<int> > M;
int n, m, k, q;
void read()
{
	M.resize(n + 2);
	for (int i = 0;i <= n + 1;i++)
		M[i].resize(m + 2);
	for (int i = 0;i <= n + 1;i++)
		M[i][0] = M[i][m + 1] = -1;
	for (int j = 0;j <= m;j++)
		M[0][j] = M[n + 1][j] = -1;
	int x, y, p;
	for (int i = 0;i < k;i++)
	{
		fin >> x >> y;
		M[x][y] = -2;
	}
	for (int i = 0;i < q;i++)
	{
		fin >> x >> y >> p;
		M[x][y] = p + 1;
	}
}
bool fill1(int x, int y)
{
	bool ok1 = 0, ok2 = 0;
	if (M[x][0] == -2)
	{
		ok1 = 1;
		for (int j = y - 1;j > 0 and ok1;j--)
			if (M[x][j])
				ok1 = 0;
	}
	if (M[x][m + 1] == -2)
	{
		ok2 = 1;
		for (int j = y + 1;j <= m and ok2;j++)
			if (M[x][j])
				ok2 = 0;
	}
	return (ok1 or ok2);
}
bool fill2(int x, int y)
{
	bool ok1 = 0, ok2 = 0;
	if (M[0][y] == -2)
	{
		ok1 = 1;
		for (int i = x - 1;i > 0 and ok1;i--)
			if (M[i][y])
				ok1 = 0;
	}
	if (M[n + 1][y] == -2)
	{
		ok2 = 1;
		for (int i = x + 1;i <= n and ok2;i++)
			if (M[i][y])
				ok2 = 0;
	}
	return (ok1 or ok2);
}
int main()
{
	short c;
	fin >> c >> n >> m >> k >> q;
	read();
	if (c == 1)
	{
		int nr = 0;
		for (int i = 1;i <= n;i++)
			for (int j = 1;j <= m;j++)
				if (M[i][j] == 1)
					nr += fill1(i, j);
				else
					if (M[i][j] == 2)
						nr += fill2(i, j);
		fout << nr;
	}
	else
	{
		pair<int, int> sol = { 0,0 }, crt;
		queue<pair<int, int> > Q;
		bool Do;
		int dif = -1;
		while (dif != sol.first)
		{
			dif = sol.first;
			sol.second++;
			for (int i = 1;i <= n;i++)
				for (int j = 1;j <= m;j++)
					if (M[i][j] == 1)
					{
						Do = fill1(i, j);
						if (Do)
						{
							sol.first++;
							Q.push({ i,j });
						}
					}
					else
						if (M[i][j] == 2)
						{
							Do = fill2(i, j);
							if (Do)
							{
								sol.first++;
								Q.push({ i,j });
							}
						}
			while (!Q.empty())
			{
				crt = Q.front();
				Q.pop();
				M[crt.first][crt.second] = 0;
			}
		}
		fout << sol.first << " " << sol.second - 1;
	}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("ron.in");
ofstream fout("ron.out");
vector<int> v(100002);
void getv()
{
	for (int i = 2;i * i <= 100000;i++)
		if (!v[i])
		{
			v[i * i] = 2;
			int j = i + 1;
			while (j * i <= 100000)
			{
				v[j * i] = 1;
				j++;
			}
		}
}
bool isprime(int x)
{
	if (!x or x == 1)
		return 0;
	if (x % 2 == 0)
		return 0;
	for (int i = 3;i * i <= x;i += 2)
		if (x % i == 0)
			return 0;
	return 1;
}
bool add(int x)
{
	int i;
	for (i = 2;i * i <= x;i++);
	if (isprime(i - 1))
		return ((i - 1) * (i - 1) == x);
	return 0;
}
int power(int x, int y)
{
	int val = 0;
	for (int i = x;y;i++, y--)
		if (v[i] == 2)
			val++;
	return val;
}
int main()
{
	short c;
	int n, x, y;
	fin >> c >> n;
	if (c == 1)
	{
		getv();
		pair<pair<int, int>, int> sol = { {0,0},0 };
		while (fin >> x >> y)
			if (x + y >= sol.first.first and sol.first.first >= x)
			{
				sol.first.first = x;
				if (sol.first.second < y)
					sol.first.second = y;
				sol.second += power(sol.first.first, sol.first.second);
			}
			else
				if (sol.first.first <= x + y and sol.first.first <= x)
				{
					if (sol.first.second < y)
					sol.first.second = y;
					sol.second += power(sol.first.first, sol.first.second);
				}
				else

				{
					int crt = power(x, y);
					if (crt > sol.second)
					{
						sol.second = crt;
						sol.first.first = x;
						sol.first.second = y;
					}
				}
		fout << sol.second;
	}
	else
	{
		vector<pair<int, int> > v;
		while (fin >> x >> y)
		{
			int sz = v.size();
			bool Do = 1;
			for (int i = sz - 1;i >= 0 and Do;i--)
				if (x + y >= v[i].first and x <= v[i].first)
				{
					Do = 0;
					v[i].first = x;
					if (v[i].second < y)
						v[i].second = y;
				}
				else
					if (v[i].first + v[i].second >= x and v[i].first <= x) 
					{
						Do = 0;
						if (v[i].second < y)
							v[i].second = y;
					}
			if (Do == 1)
				v.push_back({ x,y });
		}
		fout << v.size();
	}
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> vstd;
vector<int> d;
int n, m;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	d.resize(n + 1);
	vstd.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void breadth_first(int start)
{
	queue<int> Q;
	Q.push(start);
	int crt;
	vstd[start] = 1;
	while (!Q.empty())
	{
		crt = Q.front();
		Q.pop();
		for (auto t : G[crt])
			if (!vstd[t])
			{
				vstd[t] = 1;
				Q.push(t);
				d[t] = crt;
			}
	}
}
void Lant(int x)
{
	while (x)
	{
		cout << x << " ";
		x = d[x];
	}
}
void Lant1(int x)
{
	stack<int> S;
	while (x)
	{
		S.push(x);
		x = d[x];
	}
	while (!S.empty())
	{
		cout << S.top() << " ";
		S.pop();
	}
}
void Lant2(int x)
{
	if (x)
	{
		Lant2(d[x]);
		cout << x << " ";
	}
}
int main()
{
	read();
	breadth_first(1);
	Lant2(8);
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> vstd;
vector<int> d;
int n, m;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	d.resize(n + 1);
	vstd.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void breadth_first(int start)
{
	queue<int> Q;
	Q.push(start);
	int crt;
	vstd[start] = 1;
	while (!Q.empty())
	{
		crt = Q.front();
		Q.pop();
		for (auto t : G[crt])
			if (!vstd[t])
			{
				vstd[t] = 1;
				Q.push(t);
				d[t] = crt;
			}
	}
}
void Lant(int x)
{
	while (x != 1)
	{
		cout << x << " ";
		x = d[x];
	}
}
void Lant2(int x)
{
	if (x)
	{
		Lant2(d[x]);
		cout << x << " ";
	}
}
int main()
{
	read();
	breadth_first(1);
	Lant(3);
	Lant2(8);
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> vstd;
vector<int> d;
int n, m;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	d.resize(n + 1);
	vstd.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void depth_first(int start)
{
	cout << start << " ";
	vstd[start] = true;
	for (int t : G[start])
		if (!vstd[t])
			depth_first(t);
}
int main()
{
	read();
	depth_first(1);
}*/

/*#include<iostream>
#include<fstream>
#include<string>
#include<unordered_map>
#include<set>
#include<algorithm>
using namespace std;
ifstream fin("mun.in");
ofstream fout("mun.out");
int main()
{
	int c, n;
	string code;
	fin >> c >> n;
	if (c == 1)
	{
		unordered_map<string, int> M;
		while (fin >> code)
		{
			sort(code.begin(), code.end());
			M[code] = 1;
		}
		fout << M.size();
	}
	else
		if (c == 2)
		{
			unordered_map<string, int> M;
			while (fin >> code)
			{
				sort(code.begin(), code.end());
				M[code]++;
			}
			set<int> S;
			for (pair<string, int> t : M)
				S.insert(t.second);
			set<int>::iterator s = S.begin();
			int val = *S.rbegin();
			while (val >= *s)
			{
				val -= *s;
				s++;
			}
			fout << val << " " << n - val;
		}
}*/
/*#include<iostream>
#include<fstream>
#include<map>
#include<deque>
using namespace std;
ifstream fin("robotron.in");
ofstream fout("robotron.out");
int main()
{
	short c;
	fin >> c;
	int n, l, k;
	fin >> n >> l >> k;
	if (c == 1)
	{
		int x, y;
		map<int, int> M;
		while (fin >> x >> y)
		{
			int code = x % 10;
			code += 10 * (x / 10 % 10);
			M[code]++;
		}
		fout << M.size() << " ";
		pair<int, int> t = *M.begin();
		for (pair<int, int> m : M)
			if (t.second < m.second)
				t = m;
		fout << t.first;
	}
	else
	{
		map<int, deque<pair<int, int> > > M;
		int x, y;
		while (fin >> x >> y)
		{
			int code = x % 10;
			code += 10 * (x / 10 % 10);
			M[code].push_back({ x / 100,y });
		}
		pair<int, int> winner;
		for (int i = 0;i < k;i++)
		{
			pair<int, pair<int, int> > maxy = { 0,{0,0} };
			for (pair<int, deque<pair<int, int> > > t : M)
			{
				if (maxy.second.second < t.second.front().second)
					maxy = { t.first,t.second.front() };
			}
			winner = { maxy.first,maxy.second.first };
			for (pair<int, deque<pair<int, int> > > t : M)
			{
				M[t.first].push_back(t.second.front());
				M[t.first].pop_front();
			}
		}
		fout << winner.first << " " << winner.second;
	}
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("macarie.in");
ofstream fout("macarie.out");
int main()
{
	int n, q, j, x;
	fin >> n >> q;
	vector<int> A(n), D(n, 1);
	for (int i = 0;i < n;i++)
		fin >> A[i];
	for (int i = 0;i < n;i++)
	{
		D.push_back(A[i]);
		for (j = 2;j * j < A[i];j++)
			if (A[i] % j == 0)
			{
				D.push_back(j);
				D.push_back(A[i] / j);
			}
		if (j * j == A[i])
			D.push_back(j);
	}
	sort(D.begin(), D.end());
	for (int i = 0;i < q;i++)
	{
		fin >> x;
		fout << D[x - 1] << " ";
	}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("santinele.in");
	ofstream fout("santinele.out");
	short c;
	fin >> c;
	int n, k;
	fin >> n >> k;
	if (c == 1)
	{
		vector<int> v(n);
		for (int i = 0;i < n;i++)
			fin >> v[i];
		int maxd = 1;
		for (int i = 0;i < k;i++)
		{
			int nr = 1;
			for (int j = i + 1;j <= i + k;j++)
				if (v[i] >= v[j])
					nr++;
				else
					break;
			for (int j = i - 1;j >= 0;j--)
				if (v[i] >= v[j])
					nr++;
				else
					break;
			if (maxd < nr)
				maxd = nr;
		}
		fout << maxd;
	}
	else
	{
		vector<int> v(n);
		for (int i = n - 1;i >= 0;i--)
			fin >> v[i];
		int maxd = 1, count = 0;
		for (int j = 0;j < n;j += maxd)
		{
			for (int i = j;i < k;i++)
			{
				int nr = 1;
				for (int j = i + 1;j <= i + k;j++)
					if (v[i] >= v[j])
						nr++;
					else
						break;
				for (int j = i - 1;j >= 0;j--)
					if (v[i] >= v[j])
						nr++;
					else
						break;
				if (maxd < nr)
					maxd = nr;
			}
			count++;
		}
		fout << count;
	}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int Max = 0, n, m;
vector<vector<int> > M;
void print(int i1, int j1, int i2, int j2)
{
	for (int i = i1;i <= i2;i++)
	{
		for (int j = j1;j <= j2;j++)
			cout << M[i][j] << " ";
		cout << endl;
	}
	cout << endl;
}
int score_matrix(int i1, int j1, int i2, int j2)
{
	int score = 0;
	for (int i = i1;i <= i2;i++)
		for (int j = j1;j <= j2;j++)
			if (i % 2 == j % 2)
				score += M[i][j];
			else
				score -= M[i][j];
	return score;
}
void divide_matrix(int i1, int j1, int i2, int j2)
{
	int score = score_matrix(i1, j1, i2, j2);
	if (Max < score)
		Max = score;
	if (i1 <= i2 and j1 <= j2)
	{
		divide_matrix(i1 + 1, j1, i2, j2);
		divide_matrix(i1, j1, i2 - 1, j2);
		divide_matrix(i1, j1 + 1, i2, j2);
		divide_matrix(i1, j1, i2, j2 - 1);
	}
}
int main()
{
	ifstream fin("trafalet.in");
	ofstream fout("trafalet.out");
	fin >> n >> m;
	M.resize(n);
	for (int i = 0;i < n;i++)
		M[i].resize(m);
	for (int i = 0;i < n;i++)
		for (int j = 0;j < m;j++)
			fin >> M[i][j];
	divide_matrix(0, 0, n - 1, m - 1);
	fout << Max;
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> viz;
int n, m;
void read()
{
	int x, y;
	fin >> n >> m;
	G.resize(n + 1);
	viz.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void print()
{
	for (int i = 1;i <= n;i++)
	{
		cout << i << " : ";
		for (int j : G[i])
			cout << j << " ";
		cout << '\n';
	}
}
int nr_izolated()
{
	int nr = 0;
	for (int i = 1;i <= n;i++)
		if (!G[i].size())
			nr++;
	return nr;
}
void dfs(int x)
{
	cout << x << " ";
	viz[x] = true;
	for (auto t : G[x])
		if (!viz[t])
			dfs(t);
}
int main()
{
	read();
	dfs(1);
}*/

//Tema pregatire
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> viz;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	viz.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void print()
{
	for (int i = 1;i <= n;i++)
	{
		cout << i << " : ";
		for (int j : G[i])
			cout << j << " ";
		cout << '\n';
	}
}
void dfs1(int k, int& nr)
{
	viz[k] = true;
	for (int t : G[k])
		if (!viz[t])
		{
			viz[t] = true;
			nr++;
			dfs1(t, nr);
		}
}
void dfs2(int k)
{
	viz[k] = true;
	for (int t : G[k])
		if (!viz[t])
		{
			viz[t] = true;
			dfs2(t);
		}
}
void dfs3(int k)
{
	viz[k] = true;
	cout << k << " ";
	for (int t : G[k])
		if (!viz[t])
		{
			viz[t] = true;
			dfs3(t);
		}
}
int main()
{
	short c;
	fin >> c;
	read();
	if (c == 1)
	{
		int nr = 1;
		dfs1(1, nr);
		if (nr == n)
			cout << "conex";
		else
			cout << "neconex";
	}
	else
		if (c == 2)
		{
			int nr = 0;
			for (int i = 1;i <= n;i++)
				if (!viz[i])
				{
					nr++;
					dfs2(i);
				}
			cout << nr;
		}
		else
			for (int i = 1;i <= n;i++)
				if (!viz[i])
				{
					dfs3(i);
					cout << '\n';
				}
}*/

//Exercitii
/*include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("tablou.in");
	ofstream fout("tablou.out");
	short p;
	fin >> p;
	if (p == 1)
	{
		int n, k;
		fin >> n >> k;
		vector<vector<bool> > M(n);
		for (int i = 0;i < n;i++)
			M[i].resize(n, 1);
		for (int i = 0;i < k;i++)
		{
			char c;
			int x;
			fin >> c >> x;
			if (c == 'L')
				for (int j = 0;j < n;j++)
					M[x - 1][j] = !M[x - 1][j];
			else
				for (int j = 0;j < n;j++)
					M[j][x - 1] = !M[j][x - 1];
		}
		int nr = 0;
		for (int i = 0;i < n;i++)
			for (int j = 0;j < n;j++)
				if (M[i][j] == 1)
					nr++;
		fout << nr;
	}
	else
	{

	}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<map>
using namespace std;
#define MOD 1000003
ifstream fin("triunghiuri.in");
ofstream fout("triunghiuri.out");
vector<pair<int, int> > v;
vector<bool> viz;
vector<int> c(4);
int n;
void C(int k, int& nr)
{
	if (k == 4)
	{
		if (v[c[1]].first != v[c[2]].first and v[c[1]].first != v[c[3]].first and v[c[2]].first != v[c[3]].first)
		{
			if (v[c[1]].second == v[c[2]].second and v[c[1]].second != v[c[3]].second)
				nr = (nr + 1) % MOD;
			else
				if (v[c[1]].second == v[c[3]].second and v[c[1]].second != v[c[2]].second)
					nr = (nr + 1) % MOD;
				else
					if (v[c[2]].second == v[c[3]].second and v[c[2]].second != v[c[1]].second)
						nr = (nr + 1) % MOD;
		}
	}
	else
		for (int i = c[k - 1] + 1;i <= n;i++)
			if (!viz[i])
			{
				c[k] = i;
				viz[i] = true;
				C(k + 1, nr);
				viz[i] = false;
			}
}
int main()
{
	short p;
	fin >> p >> n;
	if (p == 1)
	{
		int nr = 0;
		map<int, int> M;
		for (int i = 0;i < n;i++)
		{
			int x, y;
			fin >> x >> y;
			M[x]++;
		}
		for (pair<int, int> t : M)
			if (nr < t.second)
				nr = t.second;
		fout << nr;
	}
	else
	{
		int nr = 0;
		v.resize(n + 1);
		viz.resize(n + 1);
		for (int i = 1;i <= n;i++)
			fin >> v[i].first >> v[i].second;
		C(1, nr);
		fout << nr;
	}
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
#include<stack>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> viz;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	viz.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void dfs(int k)
{
	stack<int> S;
	cout << k << " ";
	S.push(k);
	viz[k] = true;
	while (!S.empty())
	{
		int vf = S.top();
		bool ok = false;
		for (int t : G[vf])
			if (!viz[t])
			{
				S.push(t);
				cout << t << " ";
				viz[t] = true;
				ok = true;
				break;
			}
		if (!ok)
			S.pop();
	}
}
int main()
{
	read();
	dfs(1);
}*/
/*#include<iostream>
#include<fstream>
using namespace std;
int main()
{
	ifstream fin("bac.txt");
	int s, x, smax;
	fin >> s;
	smax = s;
	while (fin >> x)
	{
		if (x > s + x)
			s = x;
		else
			s += x;
		if (smax < s)
			smax = s;
	}
	cout << smax;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	int i, s, smax, x;
	vector<int> dp;
	ifstream fin("bac.txt");
	fin >> x;
	dp.push_back(x);
	smax = x;
	while (fin >> x)
	{

		if (*dp.rbegin() + x < x)
			dp.push_back(x);
		else
			dp.push_back(*dp.rbegin() + x);
		if (*dp.rbegin() > smax)
			smax = *dp.rbegin();
	}
	cout << smax;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> viz;
vector<int> Length, T;
int n, m, start;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	viz.resize(n + 1);
	Length.resize(n + 1);
	T.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void bfs(int start)
{
	queue<int> Q;
	Q.push(start);
	viz[start] = 1;
	int vf;
	Length[start] = 0;
	T[start] = 0;
	while (!Q.empty())
	{
		vf = Q.front();
		for (int vec : G[vf])
			if (viz[vec] == 0)
			{
				cout << vec << " ";
				Q.push(vec);
				viz[vec] = 1;
				Length[vec] = Length[vf] + 1;
				T[vec] = vf;
			}
		Q.pop();
	}
}
int main()
{
	read();
	bfs(4);
	cout << endl;
	for (int i = 1;i <= n;i++)
		cout << Length[i] << " ";
	cout << endl;
	for (int i = 1;i <= n;i++)
		cout << T[i] << " ";
}*/

//Stack-sort
/*#include<iostream>
#include<stack>
using namespace std;
void print(stack<int>& S)
{
	if (!S.empty())
	{
		int x = S.top();
		S.pop();
		print(S);
		cout << x << " ";
	}
}
void print_rev(stack<int>& S)
{
	if (!S.empty())
	{
		cout << S.top() << " ";
		S.pop();
		print_rev(S);
	}
}
void Insert(stack<int>& move2, stack<int>& move1)
{
	if (!move2.empty())
	{
		move1.push(move2.top());
		move2.pop();
		Insert(move2, move1);
	}
}
int main()
{
	stack<int> S, move1, move2;
	int x;
	for (cin >> x;x;cin >> x)
		S.push(x);
	if (!S.empty())
	{
		move1.push(S.top());
		S.pop();
	}
	while (!S.empty())
	{
		if (S.top() < move1.top())
			while (!move1.empty() and move1.top() > S.top())
			{
				move2.push(move1.top());
				move1.pop();
			}
		move1.push(S.top());
		S.pop();
		Insert(move2, move1);
	}
	print(move1);
}*/

//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> viz;
int n, m;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	viz.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
bool bfs(int start)
{
	int nr = 1, nod;
	queue<int> Q;
	Q.push(start);
	viz[start] = true;
	while (!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		for (int t : G[nod])
			if (!viz[t])
			{
				viz[t] = true;
				nr++;
				Q.push(t);
			}
	}
	return (nr == n);
}
int main()
{
	read();
	cout << bfs(1);
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> viz;
int n, m;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	viz.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void bfs(int start)
{
	viz[start] = true;
	queue<int> Q;
	Q.push(start);
	int nod;
	while (!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		for (int t : G[nod])
			if (!viz[t])
			{
				Q.push(t);
				viz[t] = true;
			}
	}
}
int main()
{
	read();
	int nr = 0;
	for (int i = 1;i <= n;i++)
		if (!viz[i])
		{
			nr++;
			bfs(i);
		}
	cout << nr;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> viz;
int n, m;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	viz.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void bfs(int start)
{
	queue<int> Q;
	Q.push(start);
	viz[start] = true;
	int nod;
	cout << start << " ";
	while (!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		for (int t : G[nod])
			if (!viz[t])
			{
				viz[t] = true;
				Q.push(t);
				cout << t << " ";
			}
	}
}
int main()
{
	read();
	for (int i = 1;i <= n;i++)
		if (!viz[i])
		{
			bfs(i);
			cout << '\n';
		}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<bool> viz;
vector<int> Length;
int n, m;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	viz.resize(n + 1);
	Length.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
int bfs(int start, int end)
{
	queue<int> Q;
	Q.push(start);
	viz[start] = true;
	int nod;
	Length[start] = 0;
	while (!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		for (int t : G[nod])
			if (!viz[t])
			{
				viz[t] = true;
				Length[t] = Length[nod] + 1;
				if (t == end)
					return Length[t];
				Q.push(t);
			}
	}
	retrun -1;
}
int main()
{
	int x, y;
	fin >> x >> y;
	read();
	cout << bfs(x, y);
}*/
/*#include<iostream>
#include<fstream>
using namespace std;
int main()
{
	int x, s, smin;
	ifstream fin("bac.txt");
	fin >> s;
	smin = s;
	while (fin >> x)
	{
		if (x > s + x)
			s += x;
		else
			s = x;
		if (smin > s)
			smin = s;
	}
	cout << smin;
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("bac.txt");
int main()
{
	int n, s = 0, maxneg = 0;
	bool ok = false;
	vector<int> v;
	while (fin >> n)
		v.push_back(n);
	for (int i : v)
	{
		if (i > 0)
			s += i;
		else
			if (i == 0)
				ok = true;
			else
			{
				if (maxneg == 0)
					maxneg = i;
				else
					if (maxneg < i)
						maxneg = i;
			}
	}
	if (!s and !ok)
		s = maxneg;
	cout << s;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
int main()
{
	std::vector<int> v, dp;
	std::ifstream fin("bac.txt");
	int n;
	while (fin >> n)
		v.push_back(n);
	dp.resize(v.size());
	dp[0] = v[0];
	for (int i = 1;i < n;i++)
		if (dp[i - 1] + v[i] < dp[i - 1])
			dp[i] = dp[i - 1];
		else
			dp[i] = dp[i - 1] + v[i];
	std::cout << dp[v.size() - 1];
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<int> viz;
int n, m;
bool ok = true;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	viz.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void bfs(int start)
{
	queue<int> Q;
	Q.push(start);
	viz[start] = 1;
	int nod;
	while (!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		for (int t : G[nod])
			if (!viz[t])
			{
				Q.push(t);
				if (viz[nod] == 1)
					viz[t] = 2;
				else
					viz[t] = 1;
			}
			else
				if (viz[nod] == viz[t])
					ok = false;
	}
}
int main()
{
	read();
	bfs(1);
	if (!ok)
		cout << "nu este";
	else
	{
		for (int i = 1;i <= n;i++)
			if (viz[i] == 1)
				cout << i << " ";
		cout << endl;
		for (int i = 1;i <= n;i++)
			if (viz[i] == 2)
				cout << i << " ";
	}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<int> viz;
int n, m;
bool ok = true;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	viz.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void bfs(int start)
{
	queue<int> Q;
	Q.push(start);
	viz[start] = 1;
	int nod;
	while (!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		for (int t : G[nod])
			if (!viz[t])
			{
				Q.push(t);
				viz[t] = -viz[nod];
			}
			else
				if (viz[nod] == viz[t])
					ok = false;
	}
}
int main()
{
	read();
	bfs(1);
	if (!ok)
		cout << "nu este";
	else
	{
		for (int i = 1;i <= n;i++)
			if (viz[i] == 1)
				cout << i << " ";
		cout << '\n';
		for (int i = 1;i <= n;i++)
			if (viz[i] == -1)
				cout << i << " ";
	}
}*/

//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<int> viz;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	viz.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
bool bfs(int start)
{
	queue<int> Q;
	Q.push(start);
	viz[start] = 1;
	while (!Q.empty())
	{
		for (int t : G[Q.front()])
			if (!viz[t])
			{
				viz[t] = -viz[Q.front()];
				Q.push(t);
			}
			else
				if (viz[t] == viz[Q.front()])
					return false;
		Q.pop();
	}
	return true;
}
int main()
{
	read();
	if (bfs(1))
	{
		for (int i = 1;i <= n;i++)
			if (viz[i] == 1)
				cout << i << " ";
		cout << '\n';
		for (int i = 1;i <= n;i++)
			if (viz[i] == -1)
				cout << i << " ";
	}
	else
		cout << "nu este";
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<int> viz;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	viz.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
bool dfs(int start)
{
	queue<int> Q;
	Q.push(start);
	viz[start] = 1;
	while (!Q.empty())
	{
		for (int t : G[Q.front()])
			if (!viz[t])
			{
				Q.push(t);
				viz[t] = Q.front() + 1;
			}
			else
				if (viz[t] == viz[Q.front()] + 1)
					return true;
		Q.pop();
	}
	return false;
}
int main()
{
	read();
	cout << dfs(1);
}*/
/*#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int n, smin = 0, nrmin = 100000;
	bool ok = false;
	cin >> n;
	vector<int> v(n);
	for (int i = 0;i < n;i++)
		cin >> v[i];
	for (int i = 0;i < n;i++)
		if (v[i] <= 0)
		{
			ok = true;
			smin += v[i];
		}
		else
			if (nrmin > v[i])
				nrmin = v[i];
	if (ok)
		cout << smin;
	else
		cout << nrmin;
		}*/
//c)n - 4
//e)(n - 2) * (n - 3) / 2

/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("bac.txt");
	vector<int> v = { 5, 10, 7, 4, 5, 8, 9, 8, 10, 2 }, lg(10, 1);
	int n = 10, maxy = 1;
	for (int i = n - 1;i >= 0;i--)
	{
		for (int j = i + 1;j < n;j++)
			if (v[i] < v[j] and lg[i] < lg[j] + 1)
				lg[i] = lg[j] + 1;
		if (lg[i] > maxy)
			maxy = lg[i];
	}
	cout << maxy;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("bac.txt");
	vector<int> v = { 5, 10, 7, 4, 5, 8, 9, 8, 10, 2 }, lg(10, 1), pred(10);
	int n = 10, maxy = 1, pmax;
	pred[n - 1] = -1;
	pmax = n - 1;
	for (int i = n - 1;i >= 0;i--)
	{
		pred[i] = -1;
		for (int j = i + 1;j < n;j++)
			if (v[i] < v[j] and lg[i] < lg[j] + 1)
			{
				lg[i] = lg[j] + 1;
				pred[i] = j;
			}
		if (lg[i] > maxy)
		{
			maxy = lg[i];
			pmax = i;
		}
	}
	cout << maxy << endl;
	while (pmax != -1)
	{
		cout << v[pmax] << " ";
		pmax = pred[pmax];
	}
}*/
//Triunghiul lui Pascal
/*#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int n;
	cin >> n;
	vector<vector<int> > Pascal(n + 1, vector<int> (n + 1));
	Pascal[0][0] = 1;
	for (int i = 1;i <= n;i++)
	{
		Pascal[i][0] = 1;
		for (int j = 1;j < i;j++)
			Pascal[i][j] = Pascal[i - 1][j] + Pascal[i - 1][j - 1];
		Pascal[i][i] = 1;
	}
	for (int i = 0;i <= n;i++)
	{
		for (int j = 0;j <= i;j++)
			cout << Pascal[i][j] << " ";
		cout << '\n';
	}
	}*/
/*#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int n = 5, m = 3;
	vector<int> N = { 0,1,7,3,9,8 }, M = { 0,7,5,8 };
	vector<vector<int> > Dp(6, vector<int>(4));
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= m;j++)
			if (N[i] == M[j])
				Dp[i][j] = Dp[i - 1][j - 1] + 1;
			else
				Dp[i][j] = max(Dp[i - 1][j], Dp[i][j - 1]);
	cout << Dp[n][m];
}*/

//Graf
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
ofstream fout("graf.out");
vector<vector<int> > G;
vector<pair<int, int> > viz;
int n, m, x, y;
void divX(int n, int x)
{
	for (int i = x * n; i >= x; i -= x)
		if (i % x == 0)
			cout << i << " ";
}
void read()
{
	fin >> n >> m >> x >> y;
	G.resize(n + 1);
	viz.resize(n + 1);
	int k, l;
	while (fin >> k >> l)
	{
		G[k].push_back(l);
		G[l].push_back(k);
	}
}
void bfs(int start)
{
	queue<int> Q;
	Q.push(start);
	viz[start].first = 1;
	while (!Q.empty())
	{
		for (int t : G[Q.front()])
			if (!viz[t].first)
			{
				viz[t].first = viz[Q.front()].first + 1;
				viz[t].second = viz[Q.front()].first;
				Q.push(t);
			}
		Q.pop();
	}
}
void print(int end)
{
	if (x != end)
	{
		print(viz[end].second);
		fout << end << " ";
	}
	else
		fout << x << " ";
}
int main()
{
	read();
	bfs(x);
	fout << viz[y].first << '\n';
	print(y);
}*/
//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("sclm.in");
	ofstream fout("sclm.out");
	int n, maxy = 1;
	fin >> n;
	int pmax = n - 1;
	vector<int> v(n), dp(n, 1), pred(n, -1);
	for (int i = 0;i < n;i++)
		fin >> v[i];
	for (int i = n - 1;i >= 0;i--)
	{
		for (int j = i + 1;j < n;j++)
			if (v[i] < v[j] and dp[i] < dp[j] + 1)
			{
				dp[i] = dp[j] + 1;
				pred[i] = j;
			}
		if (maxy <= dp[i])
		{
			maxy = dp[i];
			pmax = i;
		}
	}
	fout << maxy << '\n';
	while (pmax != -1)
	{
		fout << pmax + 1 << " ";
		pmax = pred[pmax];
	}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("plopi1.in");
	ofstream fout("plopi1.out");
	int n;
	fin >> n;
	int miny = 0;
	vector<int> v(n), dp(n, 1);
	for (int i = 0;i < n;i++)
		fin >> v[i];
	for (int i = n - 1;i >= 0;i--)
	{
		for (int j = i + 1;j < n;j++)
			if (v[i] > v[j] and dp[i] < dp[j] + 1)
				dp[i] = dp[j] + 1;
		if (miny < dp[i])
			miny = dp[i];
	}
	fout << n - miny;
}*/
/*#include<iostream>
#include<fstream>
#include<string>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("lungimesubsircomunmaximal.in");
	ofstream fout("lungimesubsircomunmaximal.out");
	string word1, word2;
	fin >> word1 >> word2;
	int sz1 = word1.length(), sz2 = word2.length();
	vector<vector<int> > M(sz1 + 1, vector<int>(sz2 + 1));
	for (int i = 1; i <= sz1; i++)
		for (int j = 1; j <= sz2; j++)
			if (word1[i - 1] == word2[j - 1])
				M[i][j] = M[i - 1][j - 1] + 1;
			else
				if (M[i][j - 1] > M[i - 1][j])
					M[i][j] = M[i][j - 1];
				else
					M[i][j] = M[i - 1][j];
	fout << M[sz1][sz2];
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("radiera.in");
	ofstream fout("radiera.out");
	int n, maxy = 0;
	fin >> n;
	vector<int> v(n), dp(n, 1);
	for (int i = 0;i < n;i++)
		fin >> v[i];
	for (int i = n - 1;i >= 0;i--)
	{
		for (int j = i + 1;j < n;j++)
			if (v[i] <= v[j] and dp[i] < dp[j] + 1)
				dp[i] = dp[j] + 1;
		if (maxy < dp[i])
			maxy = dp[i];
	}
	fout << n - maxy;
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("bac.txt");
	int n;
	fin >> n;
	vector<vector<int> > M(n), dp(n);
	for (int i = 0;i < n;i++)
		M[i].resize(i + 1);
	for (int i = 0;i < n;i++)
		dp[i].resize(i + 1);
	for (int i = 0;i < n;i++)
		for (int j = 0;j <= i;j++)
			fin >> M[i][j];
	dp[n - 1] = M[n - 1];
	for (int i = n - 2;i >= 0;i--)
		for (int j = 0;j <= i;j++)
			if (dp[i + 1][j] > dp[i + 1][j + 1])
				dp[i][j] = dp[i + 1][j] + M[i][j];
			else
				dp[i][j] = dp[i + 1][j + 1] + M[i][j];
	cout << dp[0][0];
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("bac.txt");
	int n, m;
	fin >> n >> m;
	vector<vector<int> > dp(n + 1, vector<int>(m + 1));
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= m;j++)
			fin >> dp[i][j];
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= m;j++)
			if (dp[i - 1][j] > dp[i][j - 1])
				dp[i][j] += dp[i - 1][j];
			else
				dp[i][j] += dp[i][j - 1];
	cout << dp[n][m];
}*/
/*#include<iostream>
#include<fstream>
#include<string>
#include<vector>
using namespace std;
#define PASTREZ 0
#define MODIFIC 1
#define STERG 2
#define INSEREZ 3
struct Element
{
	int cost;
	int operatie;
};
string A, B;
int n, m;
vector<vector<Element> > T;
void COST()
{
	int i, j, tmin, toperatie;
	for (j = 0;j <= m;j++)
		T[0][j].cost = j;
	for (i = 0;i <= n;i++)
		T[i][0].cost = i;
	for (i = 1;i <= n;i++)
		for (j = 1;j <= m;j++)
			if (A[i - 1] == B[j - 1])
			{
				T[i][j].cost = T[i - 1][j - 1].cost;
				T[i][j].operatie = PASTREZ;
			}
			else
			{
				tmin = T[i - 1][j].cost + 1;
				toperatie = STERG;
				if (tmin > T[i - 1][j - 1].cost + 1)
				{
					tmin = T[i - 1][j - 1].cost + 1;
					toperatie = MODIFIC;
				}
				if (tmin > T[i][j - 1].cost + 1)
				{
					tmin = T[i][j - 1].cost + 1;
					toperatie = INSEREZ;
				}
				T[i][j] = { tmin,toperatie };
			}
}
void operatii()
{
	int i = n, j = m;
	while (i > 0 and j > 0)
	{
		if (T[i][j].operatie == PASTREZ)
		{
			cout << "P: " << A << endl;
			i--;
			j--;
		}
		else
			if (T[i][j].operatie == MODIFIC)
			{
				A[i - 1] = B[j - 1];
				cout << "M(" << i - 1 << "," << B[j - 1] << "): " << A << endl;
				i--;
				j--;
			}
			else
				if (T[i][j].operatie == STERG)
				{
					A.erase(i - 1, 1);
					cout << "S(" << i - 1 << "): " << A << endl;
					i--;
				}
				else
				{
					A.insert(i, 1, B[j - 1]);
					cout << "I(" << i << "," << B[j - 1] << "): " << A << endl;
					j--;
				}
	}
	while (i > 0)
	{
		A.erase(i - 1, 1);
		cout << "S(" << i - 1 << "): " << A << endl;
		i--;
	}
	while (j > 0)
	{
		A.insert(i, 1, B[j - 1]);
		cout << "I(" << i << "," << B[j - 1] << "): " << A << endl;
		j--;
	}
}
int main()
{
	ifstream fin("bac.txt");
	fin >> A >> B;
	n = A.length();
	m = B.length();
	T.resize(n + 1);
	for (int i = 0;i <= n;i++)
		T[i].resize(m + 1);
	COST();
	cout << T[n][m].cost << endl << endl;
	operatii();
}*/

//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("sumtri.in");
	ofstream fout("sumtri.out");
	int n;
	fin >> n;
	vector<vector<int> > M(n);
	for (int i = 0;i < n;i++)
		M[i].resize(i + 1);
	for (int i = 0;i < n;i++)
		for (int j = 0;j <= i;j++)
			fin >> M[i][j];
	for (int i = n - 2;i >= 0;i--)
		for (int j = 0;j <= i;j++)
			M[i][j] += max(M[i + 1][j], M[i + 1][j + 1]);
	fout << M[0][0];
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("comori.in");
	ofstream fout("comori.out");
	int n, m;
	fin >> n >> m;
	vector<vector<int> > M(n + 1, vector<int>(m + 2));
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= m;j++)
			fin >> M[i][j];
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= m;j++)
			M[i][j] += max(M[i - 1][j], max(M[i - 1][j - 1], M[i - 1][j + 1]));
	int maxy = M[n][1];
	for (int j = 2;j <= m;j++)
		if (maxy < M[n][j])
			maxy = M[n][j];
	fout << maxy;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
vector<vector<int> > G;
vector<int> extra;
vector<bool> nod, viz, Conex;
int n, m;
void read()
{
	ifstream fin("conexidad.in");
	fin >> n >> m;
	G.resize(n + 1);
	extra.resize(n + 1);
	nod.resize(n + 1);
	viz.resize(n + 1);
	Conex.resize(n + 1, true);
	Conex[0] = false;
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
		nod[x] = true;
		nod[y] = true;
	}
}
void conex(int start)
{
	viz[start] = true;
	for (int t : G[start])
		if (!viz[t])
			conex(t);
}
int main()
{
	ofstream fout("conexidad.out");
	read();
	int nr = 0, k = 0, ok = 1;
	vector<pair<int, int> > sol;
	for (int i = 1; i <= n; i++)
		if (!nod[i])
		{
			ok = true;
			for (int j = 1; j <= n and ok; j++)
				if (!nod[j] and i != j)
				{
					nod[i] = true;
					nod[j] = true;
					sol.push_back({ i,j });
					G[i].push_back(j);
					G[j].push_back(i);
					extra[i]++;
					extra[j]++;
					nr++;
					ok = false;
				}
			if (ok)
			{
				k = i;
				ok = 2;
			}
		}
	int min_max = 100;
	if (ok == 2)
	{
		int t = 0;
		for (int i = 1; i <= n; i++)
			if (min_max > extra[i])
			{
				min_max = extra[i];
				t = i;
			}
		extra[t]++;
		nr++;
		sol.push_back({ k,t });
		G[k].push_back(t);
		G[t].push_back(k);
	}
	for (int i = 1; i <= n; i++)
	{
		conex(i);
		if (Conex != viz)
		{
			min_max = 100;
			int t = 0;
			for (int j = 1; j <= n; j++)
				if (min_max > extra[j] and i != j and !viz[j])
				{
					min_max = extra[j];
					t = j;
				}
			sol.push_back({ i,t });
			G[i].push_back(t);
			G[t].push_back(i);
			extra[i]++;
			extra[t]++;
			conex(t);
			nr++;
			viz.clear();
			viz.resize(n + 1);
		}
	}
	int extra_max = 1;
	for (int i = 1; i <= n; i++)
		if (extra_max < extra[i] and extra[i])
			extra_max = extra[i];
	fout << extra_max << '\n' << nr << '\n';
	for (pair<int, int> T : sol)
		fout << T.first << " " << T.second << '\n';
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int main()
{
	ifstream fin("lacusta.in");
	ofstream fout("lacusta.out");
	int n, m;
	fin >> n >> m;
	vector<vector<int> > M(n, vector<int>(m)), dp(n, vector<int>(m, 256));
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			fin >> M[i][j];
	for (int j = 1; j < m; j++)
		dp[1][j] = M[0][0] + M[0][j] + M[1][j];
	for (int i = 1; i < n; i++)
		for (int j = 0;j < m;j++)
		{
			int miny = M[i][0], t = 0;
			for (int k = 1;k < m;k++)
				if (miny > M[i][k])
				{
					miny = M[i][k];
					t = k;
				}
			if (t != j)
				dp[i][j] = M[i][j] + M[i - 1][j] + miny;
			else
			{
				for (int k = 1;k < m;k++)
					if (miny > M[i][k] and k != t)
						miny = M[i][k];
				dp[i][j] = M[i][j] + M[i - 1][j] + miny;
			}
		}
	int Miny = M[n - 1][0];
	for (int j = 0;j < m;j++)
		if (Miny > M[n - 1][j])
			Miny = M[n - 1][j];
	fout << M[n - 1][m - 1] + Miny;
	for (int i = 0;i < n;i++)
	{
		for (int j = 0;j < m;j++)
			cout << dp[i][j] << " ";
		cout << endl;
	}
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("bac.txt");
vector<vector<bool> > G;
vector<int> lant;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1, vector<bool>(n + 1));
	int x, y;
	while (fin >> x >> y)
	{
		G[x][y] = true;
		G[y][x] = true;
	}
}
void euler(int start)
{
	for (int i = 1;i <= n;i++)
		if (G[start][i])
		{
			G[start][i] = false;
			G[i][start] = false;
			euler(i);
		}
	lant.push_back(start);
}
int main()
{
	read();
	euler(1);
	for (int i : lant)
		cout << i << " ";
}*/

/*#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
ifstream fin("euler.in");
ofstream fout("euler.out");
vector<vector<bool> > G;
vector<int> chain;
int n;
void read()
{
	fin >> n;
	G.resize(n + 1, vector<bool>(n + 1));
	int x, y;
	while (fin >> x >> y)
		G[x][y] = G[y][x] = true;
}
void euler(int start)
{
	for (int i = 1;i <= n;i++)
		if (G[start][i])
		{
			G[start][i] = G[i][start] = false;
			euler(i);
		}
	chain.push_back(start);
}
int main()
{
	read();
	euler(1);
	fout << chain.size() << '\n';
	for (int i : chain)
		fout << i << ' ';
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("bac.txt");
vector<vector<int> > G;
vector<pair<int, int> > Grad;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	Grad.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		Grad[y].first++;
		Grad[x].second++;
	}
}
void print()
{
	for (int i = 1;i <= n;i++)
	{
		cout << i << " : ";
		for (int j : G[i])
			cout << j << ' ';
		cout << '\n';
	}
}
void solve()
{
	for (int i = 1;i <= n;i++)
		cout << i << " : -grad interior : " << Grad[i].first << "\n    -grad exterior : " << Grad[i].second << '\n';
}
int main()
{
	read();
	solve();
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("graf.in");
vector<vector<pair<int, int> > > G;
vector<bool> ales;
vector<int> ciclu;
int n, m, nrm = 0;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	ales.resize(m + 1);
	int x, y;
	while (fin >> x >> y)
	{
		nrm++;
		G[x].push_back({ y,nrm });
		G[y].push_back({ x,nrm });
	}
}
void euler(int vf)
{
	int y, nrm;
	while (!G[vf].empty())
	{
		y = G[vf].back().first;
		nrm = G[vf].back().second;
		G[vf].pop_back();
		if (!ales[nrm])
		{
			ales[nrm] = 1;
			euler(y);
		}
	}
	ciclu.push_back(vf);
}
int main()
{
	read();
	euler(1);
	for (int i : ciclu)
		cout << i << ' ';
}*/

//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("orase.in");
ofstream fout("orase.out");
vector<vector<int> > G;
vector<bool> viz;
vector<int> road;
int n;
void read()
{
	fin >> n;
	G.resize(n + 1, vector<int>(n + 1));
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= n;j++)
			fin >> G[i][j];
}
void euler(int start, int& s)
{
	viz[start] = true;
	int miny = 1000, t = 0;
	for (int i = 1;i <= n;i++)
		if (miny > G[start][i] and !viz[i])
		{
			miny = G[start][i];
			t = i;
		}
	if (t)
		euler(t, s);
	road.push_back(start);
}
int main()
{
	read();
	int miny = 1000000, s;
	vector<int> real_road;
	for (int i = 1;i <= n;i++)
	{
		viz.clear();
		road.clear();
		viz.resize(n + 1);
		s = 0;
		euler(i, s);
		s += G[i][road[0]];
		for (int i = 0;i < n - 1;i++)
			s += G[road[i]][road[i + 1]];
		if (miny > s)
		{
			miny = s;
			real_road = road;
		}
	}
	fout << miny;
	fout << '\n';
	for (int i = n - 1;i >= 0;i--)
		fout << real_road[i] << ' ';
	fout << real_road[n - 1];
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
ifstream fin("parc.in");
ofstream fout("parc.out");
vector<vector<int> > G;
vector<int> color;
vector<bool> nrcolor;
int n;
void read()
{
	fin >> n;
	G.resize(n + 1);
	color.resize(n + 1);
	nrcolor.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void solve(int start)
{
	color[start] = 1;
	nrcolor[1] = true;
	queue<int> Q;
	Q.push(start);
	while (!Q.empty())
	{
		vector<int> used_color;
		for (int t : G[Q.front()])
			if (!color[t])
				Q.push(t);
			else
				used_color.push_back(color[t]);
		for (int i = 1;i <= n;i++)
			if (find(used_color.begin(), used_color.end(), i) == used_color.end())
			{
				color[Q.front()] = i;
				nrcolor[i] = true;
				break;
			}
		Q.pop();
	}
}
int main()
{
	read();
	solve(1);
	int nr = 0;
	for (int i = 1;i <= n;i++)
		if (nrcolor[i])
			nr++;
	fout << nr << '\n';
	for (int i = 1;i <= n;i++)
		fout << color[i] << ' ';
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("cartite.in");
ofstream fout("cartite.out");
vector<vector<int> > M;
vector<int> Viz;
vector<vector<pair<int, int> > > G;
vector<pair<int, int> > v, vmax;
short c;
int n, m;
pair<int, int> cartita;
void read()
{
	fin >> c >> n >> m;
	fin >> cartita.first >> cartita.second;
	M.resize(n + 2, vector<int>(m + 2));
	G.resize(n * m + 1);
	Viz.resize(n * m + 1);
	for (int i = 0; i <= n + 1; i++)
		M[i][0] = M[i][m + 1] = -1;
	for (int j = 0; j <= m + 1; j++)
		M[0][j] = M[n + 1][j] = -1;
	int vulpe;
	fin >> vulpe;
	for (int i = 1; i <= vulpe; i++)
	{
		int x, y, range;
		fin >> x >> y >> range;
		M[x][y] = -1;
		if (range >= 1)
		{
			if (x > 0)
				M[x - 1][y] = -1;
			if (x < n)
				M[x + 1][y] = -1;
			if (y > 0)
				M[x][y - 1] = -1;
			if (y < m)
				M[x][y + 1] = -1;
		}
		if (range >= 2)
		{
			if (x > 1)
				M[x - 2][y] = -1;
			if (x < n - 1)
				M[x + 2][y] = -1;
			if (y > 1)
				M[x][y - 2] = -1;
			if (y < m - 1)
				M[x][y + 2] = -1;
		}
	}
	int g;
	fin >> g;
	for (int i = 1; i <= g; i++)
	{
		int x1, y1, x2, y2;
		fin >> x1 >> y1 >> x2 >> y2;
		G[(x1 - 1) * m + y1].push_back({ x2,y2 });
		M[x1][y1] = -2;
		M[x2][y2] = -2;
	}
}
void print()
{
	for (int i = 0; i <= n + 1; i++)
	{
		for (int j = 0; j <= m + 1; j++)
			cout << M[i][j] << " ";
		cout << '\n';
	}
}
pair<pair<int, int>, int> Lee(pair<int, int> start)
{
	queue<pair<int, int> > Q;
	Q.push(start);
	vector<int> di = { 1,-1,0,0 };
	vector<int> dj = { 0,0,1,-1 };
	while (!Q.empty())
	{
		for (int i = 0; i <= 3; i++)
		{
			if (M[Q.front().first + di[i]][Q.front().second + dj[i]] == -2)
				return { {Q.front().first + di[i],Q.front().second + dj[i]},M[Q.front().first][Q.front().second] + 1 };
			if (M[Q.front().first + di[i]][Q.front().second + dj[i]] == 0)
			{
				M[Q.front().first + di[i]][Q.front().second + dj[i]] = M[Q.front().first][Q.front().second] + 1;
				Q.push({ Q.front().first + di[i], Q.front().second + dj[i] });
			}
		}
		Q.pop();
	}
	return { {-1,-1},-1 };
}
void Euler(pair<int, int> start)
{
	int cord = (start.first - 1) * m + start.second;
	while (!G[cord].empty())
	{
		int x, y;
		x = G[cord].back().first;
		y = G[cord].back().second;
		G[cord].pop_back();
		if (!Viz[cord])
		{
			Viz[cord] = true;
			Euler({ x,y });
		}
	}
	v.push_back(start);
}
void printG()
{
	for (int i = 1;i <= n * m;i++)
	{
		cout << i << " : ";
		for (pair<int, int> j : G[i])
			cout << j.first << ' ' << j.second << " , ";
		cout << '\n';
	}
}
int main()
{
	read();
	if (c == 1)
	{
		pair<pair<int, int>, int> t = Lee(cartita);
		fout << t.first.first << ' ' << t.first.second << ' ' << t.second;
	}
	else
	{
		for (int i = 1;i <= n;i++)
			for (int j = 1;j <= m;j++)
			{
				v.clear();
				Euler({ i,j });
				if (v.size() > vmax.size())
					vmax = v;
			}
		pair<int, int> k = *vmax.rbegin();
		fout << k.first << ' ' << k.second << '\n';
		for (pair<int, int> t : vmax)
			fout << t.first << ' ' << t.second << '\n';
	}
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G, M;
vector<int> Ext, Int;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	Ext.resize(n + 1);
	Int.resize(n + 1);
	M.resize(n + 1, vector<int>(n + 1));
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		Ext[x]++;
		Int[y]++;
		M[x][y] = 1;
	}
}
void FW()
{
	for (int k = 1;k <= n;k++)
		for (int i = 1;i <= n;i++)
			for (int j = 1;j <= n;j++)
				if (i != j and !M[i][j] and M[i][k] * M[k][j] == 1)
					M[i][j] = 1;
}
int main()
{
	read();
	for (int i = 1;i <= n;i++)
		cout << i << " : " << Ext[i] << ' ' << Int[i] << '\n';
	FW();
	for (int i = 1;i <= n;i++)
	{
		for (int j = 1;j <= n;j++)
			cout << M[i][j] << ' ';
		cout << '\n';
	}
}*/

//Tema
//d) 7
//b) 2
//b) 2
//b) 2
//c) 15
//c) 3
//b) 2
//
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("bac.txt");
int main()
{
	int n, P, Q;
	fin >> n >> P >> Q;
	vector<vector<int> > M(n, vector<int>(n - P + 2)), dp(n, vector<int>(n - Q + 2));
	for (int i = 0;i < n;i++)
		for (int j = 0;j < n;j++)
			fin >> M[i][j];
	for (int i = 0;i <= n - P;i++)
		for (int j = 0;j <= n - Q;j++)
			for (int k = 0;k < P;k++)
				for (int t = 0;t < Q;t++)
					dp[i][j] += M[k + i][t + j];
	int maxy = dp[0][0];
	for (int i = 0;i <= n - P;i++)
		for (int j = 0;j <= n - Q;j++)
			if (maxy < dp[i][j])
				maxy = dp[i][j];
	cout << maxy;
}*/
/*#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int A, B, C, D;
vector<vector<int> > dp(1005, vector<int>(1005, -1));
queue<pair<int, int> > Q;
bool Ok(int x, int y)
{
	return (x >= 0 and y >= 0 and x <= 1000 and y <= 1000 and dp[x][y] == -1);
}
void solve()
{
	Q.push({ A,B });
	dp[A][B] = 0;
	while (!Q.empty() and dp[C][D] == -1)
	{
		int x, y;
		x = Q.front().first;
		y = Q.front().second;
		Q.pop();
		if (Ok(x + y, y))
		{
			dp[x + y][y] = dp[x][y] + 1;
			Q.push({ x + y,y });
		}
		if (Ok(x - y, y))
		{
			dp[x - y][y] = dp[x][y] + 1;
			Q.push({ x - y,y });
		}
		if (Ok(y, x))
		{
			dp[y][x] = dp[x][y] + 1;
			Q.push({ y,x });
		}
	}
}
int main()
{
	cin >> A >> B >> C >> D;
	solve();
	if (dp[C][D] != -1)
		cout << dp[C][D];
	else
		cout << "Imposibile";
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("graf.in");
vector<vector<bool> > M;
vector<int> ctc, viz;
int n, m, nrc = 0;
void read()
{
	fin >> n >> m;
	int x, y;
	M.resize(n + 1, vector<bool>(n + 1));
	viz.resize(n + 1);
	while (fin >> x >> y)
		M[x][y] = true;
}
void FW()
{
	for (int k = 1;k <= n;k++)
		for (int i = 1;i <= n;i++)
			for (int j = 1;j <= n;j++)
				if (i != j and !M[i][j] and M[i][k] * M[k][j] == 1)
					M[i][j] = true;
}
void CTC()
{
	ctc.resize(n + 1);
	for (int i = 1;i <= n;i++)
		if (!viz[i])
		{
			nrc++;
			viz[i] = nrc;
			for (int j = 1;j <= n;j++)
				if (M[i][j] and M[j][i])
					viz[j] = nrc;
		}
}
int main()
{
	read();
	FW();
	CTC();
	for (int i = 1;i <= nrc;i++)
	{
		for (int j = 1;j <= n;j++)
			if (viz[j] == i)
				cout << j << ' ';
		cout << '\n';
	}
}*/
//Sortare topologica
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G;
vector<int> viz, Int;
stack<int> S;
int n, m;
void read()
{
	fin >> n >> m;
	int x, y;
	G.resize(n + 1);
	viz.resize(n + 1);
	Int.resize(n + 1);
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		Int[y]++;
	}
}
void top_sort()
{
	queue<int> Q;
	for (int i = 1;i <= n;i++)
		if (!Int[i])
			Q.push(i);
	while (!Q.empty())
	{
		cout << Q.front() << ' ';
		for (int i : G[Q.front()])
		{
			Int[i]--;
			if (!Int[i])
				Q.push(i);
		}
		Q.pop();
	}
}
void r_top_sort(int vf)
{
	cout << vf << ' ';
	viz[vf] = true;
	for (int t : G[vf])
	{
		Int[t]--;
		if (!Int[t] and !viz[t])
			r_top_sort(t);
	}
}
int main()
{
	read();
	for (int i = 1;i <= n;i++)
		if (!Int[i] and !viz[i])
			r_top_sort(i);
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<stack>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G, GT;
vector<int> CTC, viz;
stack<int> S;
int n, m, nrc = 0;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	GT.resize(n + 1);
	CTC.resize(n + 1);
	viz.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		GT[y].push_back(x);
	}
}
void print_GT()
{
	for (int i = 1;i <= n;i++)
	{
		cout << i << " : ";
		for (int j : GT[i])
			cout << j << ' ';
		cout << '\n';
	}
}
int main()
{
	read();
	print_GT();
}*/

//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("topsort.in");
ofstream fout("topsort.out");
vector<vector<int> > G;
vector<int> Int;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	Int.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		Int[y]++;
	}
}
void top_sort()
{
	queue<int> Q;
	for (int i = 1;i <= n;i++)
		if (!Int[i])
			Q.push(i);
	while (!Q.empty())
	{
		fout << Q.front() << ' ';
		for (int t : G[Q.front()])
		{
			Int[t]--;
			if (!Int[t])
				Q.push(t);
		}
		Q.pop();
	}
}
int main()
{
	read();
	top_sort();
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
vector<vector<bool> > G;
vector<bool> viz;
int n, m;
void read()
{
	cin >> n >> m;
	G.resize(n + 1, vector<bool>(n + 1));
	viz.resize(n + 1);
	int x, y;
	for (int i = 0;i < m;i++)
	{
		cin >> x >> y;
		G[x][y] = true;
	}
}
void FW()
{
	for (int k = 1;k <= n;k++)
		for (int i = 1;i <= n;i++)
			for (int j = 1;j <= n;j++)
				if (i != j and !G[i][j] and G[i][k] * G[k][j] == 1)
					G[i][j] = true;
}
int main()
{
	read();
	int nrc = 0;
	FW();
	for (int i = 1;i <= n;i++)
		if (!viz[i])
		{
			nrc++;
			viz[i] = true;
			for (int j = 1;j <= n;j++)
				if (G[i][j] and G[j][i])
					viz[j] = true;
		}
	cout << nrc;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("pm.in");
ofstream fout("pm.out");
vector<vector<int> > G, Gt;
vector<int> Time, Int, sorted;
vector<pair<int, int> > value;
int n;
void read()
{
	fin >> n;
	G.resize(n + 1);
	Gt.resize(n + 1);
	Time.resize(n + 1);
	Int.resize(n + 1);
	value.resize(n + 1);
	for (int i = 1;i <= n;i++)
		fin >> Time[i];
	for (int i = 1;i <= n;i++)
	{
		int k;
		fin >> k;
		for (int j = 1;j <= k;j++)
		{
			int phase;
			fin >> phase;
			G[phase].push_back(i);
			Gt[i].push_back(phase);
			Int[i]++;
		}
	}
}
void top_sort()
{
	queue<int> Q;
	for (int i = 1;i <= n;i++)
		if (!Int[i])
			Q.push(i);
	while (!Q.empty())
	{
		sorted.push_back(Q.front());
		for (int t : G[Q.front()])
		{
			Int[t]--;
			if (!Int[t])
				Q.push(t);
		}
		Q.pop();
	}
}
void distance()
{
	vector<int> New_time = Time;
	for (int i : sorted)
	{
		int miny = 0;
		for (int j : Gt[i])
			if (!miny or miny < New_time[j])
				miny = New_time[j];
		New_time[i] += miny;
	}
	int maxy = New_time[1];
	for (int i = 2;i <= n;i++)
		if (maxy < New_time[i])
			maxy = New_time[i];
	fout << maxy << '\n';
	for (int i = 1;i <= n;i++)
		value[i].first = New_time[i] - Time[i];
	for (int i = n;i >= 1;i--)
	{
		int maxy2 = 0;
		for (int t : G[i])
			if (!maxy2 or maxy2 > value[t].second)
				maxy2 = value[t].second;
		if (!maxy2)
			value[i].second = maxy - Time[i];
		else
			value[i].second = maxy2 - Time[i];
	}
	for (int i = 1;i <= n;i++)
		fout << value[i].first << ' ' << value[i].second << '\n';
}
int main()
{
	read();
	top_sort();
	distance();
}*/

//Kosaraj
/*#include<iostream>
#include<fstream>
#include<vector>
#include<stack>
using namespace std;
ifstream fin("graf.in");
vector<vector<int> > G, Gt;
vector<int> viz, CTC;
stack<int> S;
int n, m, nrc = 0;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	Gt.resize(n + 1);
	viz.resize(n + 1);
	CTC.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		Gt[y].push_back(x);
	}
}
void dfs(int start)
{
	viz[start] = 1;
	for (int t : G[start])
		if (!viz[t])
			dfs(t);
	S.push(start);
}
void dfst(int start)
{
	viz[start] = 2;
	CTC[start] = nrc;
	for (int t : Gt[start])
		if (viz[t] == 1)
			dfst(t);
}
void solve()
{
	for (int i = 1;i <= n;i++)
		if (viz[i] == 0)
			dfs(i);
	while (!S.empty())
	{
		if (viz[S.top()] == 1)
		{
			nrc++;
			dfst(S.top());
		}
		S.pop();
	}
	cout << nrc << '\n';
}
void print()
{
	if (!S.empty())
	{
		cout << S.top() << ' ';
		S.pop();
		print();
	}
}
int main()
{
	read();
	solve();
	for (int i = 1;i < n;i++)
	{
		for (int j = 1;j <= n;j++)
			if (CTC[j] == CTC[i])
				cout << j << ' ';
		cout << '\n';
	}
}*/
//Dijkstra
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("dijkstra.in");
#define CV pair<int,int>
#define oo 0x3f3f3f3f
vector<vector<CV> > G;
vector<int> cost, pred;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	cost.resize(n + 1, oo);
	pred.resize(n + 1, 0);
	int x, y, c;
	while (fin >> x >> y >> c)
		G[x].push_back({ y,c });
}
void Dijkstra(int start)
{
	priority_queue<CV, vector<CV>, greater<CV> > PQ;
	PQ.push({ 0,start });
	cost[start] = 0;
	while (!PQ.empty())
	{
		int vf = PQ.top().second;
		PQ.pop();
		for (auto vec : G[vf])
		{
			int u = vec.first, c = vec.second;
			if (cost[u] > cost[vf] + c)
			{
				cost[u] = cost[vf] + c;
				pred[u] = vf;
				PQ.push({ cost[u], u });
			}
		}
	}
}
void print()
{
	for (int i = 1;i <= n;i++)
		cout << cost[i] << ' ';
	cout << '\n';
	for (int i = 1;i <= n;i++)
		cout << pred[i] << ' ';
}
int main()
{
	read();
	Dijkstra(3);
	print();
}*/

//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
#define oo 0x3f3f3f3f
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
vector<vector<pair<int, int> > > G;
vector<int> cost;
int n, p;
void read()
{
	fin >> n >> p;
	G.resize(n + 1);
	cost.resize(n + 1, oo);
	int x, y, c;
	while (fin >> x >> y >> c)
		G[x].push_back({ y,c });
}
void Dijkstra()
{
	priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > PQ;
	PQ.push({ 0,p });
	cost[p] = 0;
	while (!PQ.empty())
	{
		for (pair<int, int> t : G[PQ.top().second])
			if (cost[t.first] > cost[PQ.top().second] + t.second)
			{
				cost[t.first] = cost[PQ.top().second] + t.second;
				PQ.push({ cost[t.first],t.first });
			}
		PQ.pop();
	}
}
int main()
{
	read();
	Dijkstra();
	for (int i = 1;i <= n;i++)
		if (cost[i] == oo)
			fout << -1 << ' ';
		else
			fout << cost[i] << ' ';
}*/
/*#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define oo 0x3f3f3f3f
#define PAIR pair<int,int>
vector<vector<PAIR> > G;
vector<int> cost;
int n, m;
void read()
{
	cin >> n >> m;
	G.resize(n + 1);
	int x, y, c;
	for (int i = 0;i < m;i++)
	{
		cin >> x >> y >> c;
		G[x].push_back({ y,c });
	}
}
void Dijkstra(int start)
{
	priority_queue<PAIR, vector<PAIR>, greater<PAIR> > PQ;
	cost.clear();
	cost.resize(n + 1, oo);
	PQ.push({ 0,start });
	cost[start] = 0;
	while (!PQ.empty())
	{
		for (PAIR t : G[PQ.top().second])
			if (cost[t.first] > cost[PQ.top().second] + t.second)
			{
				cost[t.first] = cost[PQ.top().second] + t.second;
				PQ.push({ cost[t.first],t.first });
			}
		PQ.pop();
	}
}
int main()
{
	read();
	int nr = 0;
	for (int i = 1;i <= n;i++)
	{
		Dijkstra(i);
		for (PAIR j : G[i])
			if (j.second == cost[j.first])
				nr++;
	}
	cout << nr;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("firma.in");
ofstream fout("firma.out");
#define oo 0x3f3f3f3f
#define Pair pair<int,int>
vector<vector<Pair> > G;
vector<int> cost;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	int x, y, c;
	while (fin >> x >> y >> c)
	{
		G[x].push_back({ y,c });
		G[y].push_back({ x,c });
	}
}
void Dijkstra(int start)
{
	cost.clear();
	cost.resize(n + 1, oo);
	priority_queue<Pair, vector<Pair>, greater<Pair> > PQ;
	cost[start] = 0;
	PQ.push({ 0,start });
	while (!PQ.empty())
	{
		for (Pair t : G[PQ.top().second])
			if (cost[t.first] > cost[PQ.top().second] + t.second)
			{
				cost[t.first] = cost[PQ.top().second] + t.second;
				PQ.push({ cost[t.first],t.first });
			}
		PQ.pop();
	}
}
int main()
{
	read();
	int smin = oo, nod = 0;
	for (int i = 1;i <= n;i++)
	{
		Dijkstra(i);
		int s = cost[1];
		for (int i = 2;i <= n;i++)
			s += cost[i];
		if (smin > s)
		{
			smin = s;
			nod = i;
		}
	}
	fout << nod;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("parc.in");
ofstream fout("parc.out");
#define oo 0x3f3f3f3f
#define Pair pair<int,int>
vector<vector<Pair> > G;
vector<int> cost, gate;
int n, m, C, g;
void read()
{
	fin >> n >> m >> C;
	G.resize(n + 1);
	int x, y, c;
	for (int i = 0;i < m;i++)
	{
		fin >> x >> y >> c;
		G[x].push_back({ y,c });
		G[y].push_back({ x,c });
	}
	fin >> g;
	gate.resize(g);
	for (int i = 0;i < g;i++)
		fin >> gate[i];
}
void Dijkstra(int start)
{
	cost.clear();
	cost.resize(n + 1, oo);
	cost[start] = 0;
	priority_queue<Pair, vector<Pair>, greater<Pair> > PQ;
	PQ.push({ 0,start });
	while (!PQ.empty())
	{
		for (Pair t : G[PQ.top().second])
			if (cost[t.first] > cost[PQ.top().second] + t.second)
			{
				cost[t.first] = cost[PQ.top().second] + t.second;
				PQ.push({ cost[t.first],t.first });
			}
		PQ.pop();
	}
}
int main()
{
	read();
	int dmin = oo, poarta = 0;
	for (int i = 0;i < g;i++)
	{
		Dijkstra(gate[i]);
		int d = cost[C];
		if (dmin > d)
		{
			dmin = d;
			poarta = gate[i];
		}
	}
	fout << poarta;
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.in");
#define oo 0x3f3f3f3f
#define Pair pair<int,int>
vector<vector<Pair> > G;
vector<int> cost, pred;
int n, m;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	cost.resize(n + 1, oo);
	pred.resize(n + 1);
	int x, y, c;
	while (fin >> x >> y >> c)
		G[x].push_back({ y,c });
}
void Dijkstra(int start)
{
	priority_queue<Pair, vector<Pair>, greater<Pair> > PQ;
	cost[start] = 0;
	PQ.push({ 0,start });
	while (!PQ.empty())
	{
		for (Pair t : G[PQ.top().second])
			if (cost[t.first] > cost[PQ.top().second] + t.second)
			{
				cost[t.first] = cost[PQ.top().second] + t.second;
				pred[t.first] = PQ.top().second;
				PQ.push({ cost[t.first],t.first });
			}
		PQ.pop();
	}
}
void print_road(int x)
{
	if (pred[x])
		print_road(pred[x]);
	cout << x << ' ';
}
int main()
{
	read();
	Dijkstra(3);
	for (int i = 1;i <= n;i++)
		if (cost[i] != oo)
		{
			print_road(i);
			cout << '\n';
		}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("arbore.in");
vector<int> T;
int n, X, Y;
void read()
{
	fin >> n >> X >> Y;
	T.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
		T[y] = x;
}
void solve_a()
{
	for (int i = 1;i <= n;i++)
		if (!T[i])
		{
			cout << i;
			return;
		}
}
void solve_b()
{
	for (int i = 1;i <= n;i++)
		if (find(T.begin(), T.end(), i) == T.end())
			cout << i << ' ';
}
void solve_c()
{
	for (int i = 1;i <= n;i++)
		if (T[i] == X)
			cout << i << ' ';
}
void solve_d()
{
	for (int i = 1;i <= n;i++)
	{
		int t = T[i];
		while (t)
		{
			if (t == X)
			{
				cout << i << ' ';
				break;
			}
			t = T[t];
		}
	}
}
void solve_e(int start)
{
	if (start)
	{
		solve_e(T[start]);
		cout << start << ' ';
	}
}
void solve_f(int start)
{
	if (start)
	{
		solve_f(T[start]);
		cout << start << ' ';
	}
}
void solve_g(int start)
{
	if (start != 0)
	{
		solve_g(T[start]);
		cout << start << ' ';
	}
}
void solve_G(int start)
{
	if (start != 0)
	{
		cout << start << ' ';
		solve_G(T[start]);
	}
}
void solveGg()
{
	solve_G(X);
	cout << "\b\b";
	solve_g(Y);
}
int get_level(int start)
{
	if (start)
		return get_level(T[start]) + 1;
	return 0;
}
void level()
{
	for (int i = 1;i <= n;i++)
		cout << get_level(T[i]) << ' ';
}
int main()
{
	read();
	level();
}*/

//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("smallworld.in");
ofstream fout("smallworld.out");
vector<vector<int> > G;
int n;
void read()
{
	fin >> n;
	G.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
int get_road(int start)
{
	vector<int> road(n + 1);
	queue<int> Q;
	Q.push(start);
	road[start] = 1;
	while (!Q.empty())
	{
		for (int t : G[Q.front()])
			if (!road[t])
			{
				road[t] = road[Q.front()] + 1;
				Q.push(t);
			}
		Q.pop();
	}
	int maxy = road[1];
	for (int i = 2;i <= n;i++)
		if (maxy < road[i])
			maxy = road[i];
	return maxy;
}
int main()
{
	read();
	for (int i = 1;i <= n;i++)
		fout << get_road(i) - 1 << '\n';
}*/

//Kruskal
/*#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("cruscal.in");
vector<pair<int, pair<int, int> > > Edges;
vector<int> P, Height, MST;//minimum spanning tree (MST)
int n, m, weight;
void read()
{
	fin >> n >> m;
	P.resize(n + 1);
	Height.resize(n + 1);
	for (int i = 1;i <= n;i++)
		P[i] = i;
	int x, y, c;
	while (fin >> x >> y >> c)
		Edges.push_back({ c,{x,y} });
}
int get_P(int x)
{
	if (P[x] == x)
		return x;
	return get_P(P[x]);
}
void Kruskal()
{
	int M = 0, Pfirst, Psecond;
	while (MST.size() < n - 1)
	{
		Pfirst = get_P(Edges[M].second.first);
		Psecond = get_P(Edges[M].second.second);
		if (Pfirst != Psecond)
		{
			MST.push_back(M);
			if (Height[Pfirst] > Height[Psecond])
				P[Psecond] = Pfirst;
			else
				P[Pfirst] = Psecond;
			if (Height[Pfirst] == Height[Psecond])
				Height[Psecond]++;
		}
		M++;
	}
}
void print()
{
	for (int t : MST)
		weight += Edges[t].first;
	cout << weight << '\n';
	for (int t : MST)
	{
		cout << '(' << Edges[t].second.first << ',' << Edges[t].second.second << ") ";
	}
}
int main()
{
	read();
	sort(Edges.begin(), Edges.end());
	Kruskal();
	print();
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("kruskal.in");
ofstream fout("kruskal.out");
vector<pair<int, pair<int, int> > > Edges;
vector<int> P, Height, MST;
int n, m, weight = 0;
void read()
{
	fin >> n >> m;
	P.resize(n + 1);
	Height.resize(n + 1);
	for (int i = 1;i <= n;i++)
		P[i] = i;
	int x, y, c;
	while (fin >> x >> y >> c)
		Edges.push_back({ c,{x,y} });
}
int getP(int x)
{
	if (P[x] == x)
		return x;
	return getP(P[x]);
}
void kruskal()
{
	int M = 0, Pfirst, Psecond;
	while (MST.size() < n - 1)
	{
		Pfirst = getP(Edges[M].second.first);
		Psecond = getP(Edges[M].second.second);
		if (Pfirst != Psecond)
		{
			MST.push_back(M);
			if (Height[Pfirst] > Height[Psecond])
				P[Psecond] = Pfirst;
			else
				P[Pfirst] = Psecond;
			if (Height[Pfirst] == Height[Psecond])
				Height[Psecond]++;
		}
		M++;
	}
}
void print()
{
	for (int t : MST)
		weight += Edges[t].first;
	fout << weight << '\n';
	for (int t : MST)
		fout << Edges[t].second.first << ' ' << Edges[t].second.second << '\n';
}
int main()
{
	read();
	sort(Edges.begin(), Edges.end());
	kruskal();
	print();
}*/
//Prim
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("kruskal.in");
ofstream fout("kruskal.out");
#define oo 0x3f3f3f3f
#define Vecin pair<int,int>
vector<vector<Vecin> > G;
vector<int> cost, P;
vector<bool> Viz;
int n, m, start = 3;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	P.resize(n + 1, -1);
	cost.resize(n + 1, oo);
	Viz.resize(n + 1);
	int x, y, c;
	while (fin >> x >> y >> c)
	{
		G[x].push_back({ y,c });
		G[y].push_back({ x,c });
	}
}
void Prim()
{
	priority_queue<Vecin, vector<Vecin>, greater<Vecin> > PQ;
	PQ.push({ 0,start });
	cost[start] = 0;
	while (!PQ.empty())
	{
		int v = PQ.top().second;
		PQ.pop();
		if (!Viz[v])
		{
			Viz[v] = true;
			for (auto x : G[v])
			{
				int vec = x.first, c = x.second;
				if (!Viz[vec] and cost[vec] > c)
				{
					cost[vec] = c;
					PQ.push({ c,vec });
					P[vec] = v;
				}
			}
		}
	}
}
void write()
{
	for (int i = 1;i <= n;i++)
		if (i != start)
			cout << '(' << P[i] << ',' << i << ") ";
}
void print()
{
	for (int i = 1;i <= n;i++)
		if (i != start)
			fout << P[i] << ' ' << i;
}
int main()
{
	read();
	Prim();
	write();
}*/

//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("urgenta.in");
ofstream fout("urgenta.out");
int n, m, k;
vector<pair<int, pair<int, int> > > Edges;
vector<int> Height, MST, P;
vector<bool> no_print;
void read()
{
	fin >> n >> m >> k;
	P.resize(n + 1);
	Height.resize(n + 1);
	no_print.resize(m);
	for (int i = 1;i <= n;i++)
		P[i] = i;
	int x, y, c;
	while (fin >> x >> y >> c)
		Edges.push_back({ c,{x,y} });
}
int getP(int x)
{
	if (P[x] == x)
		return x;
	return getP(P[x]);
}
void Kruskal()
{
	int M = 0, Pfirst, Psecond, component = n;
	while (MST.size() < n - 1 and component > k)
	{
		Pfirst = getP(Edges[M].second.first);
		Psecond = getP(Edges[M].second.second);
		if (Pfirst != Psecond)
		{
			MST.push_back(M);
			no_print[M] = true;
			if (Height[Pfirst] > Height[Psecond])
				P[Psecond] = Pfirst;
			else
				P[Pfirst] = Psecond;
			if (Height[Pfirst] == Height[Psecond])
				Height[Psecond]++;
			component--;
		}
		M++;
	}
}
void print()
{
	int sz = Edges.size(), gravmax = 0;
	for (int i = 0;i < sz;i++)
		if (!no_print[i])
			gravmax += Edges[i].first;
	fout << gravmax << '\n' << m - MST.size() << '\n';
	for (int i = 0;i < sz;i++)
		if (!no_print[i])
			fout << Edges[i].second.first << ' ' << Edges[i].second.second << '\n';
}
int main()
{
	read();
	sort(Edges.begin(), Edges.end());
	Kruskal();
	print();
}*/

//Prim cost minim
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fin("graf.txt");
#define oo 0x3f3f3f3f
#define Vecin pair<int,int>
vector<vector<Vecin> > G;
vector<int> cost, P;
vector<bool> Viz;
int n, m, start = 3, cmin = 0;
void read()
{
	fin >> n >> m;
	G.resize(n + 1);
	P.resize(n + 1, -1);
	cost.resize(n + 1, oo);
	Viz.resize(n + 1);
	int x, y, c;
	while (fin >> x >> y >> c)
	{
		G[x].push_back({ y,c });
		G[y].push_back({ x,c });
	}
}
void Prim()
{
	priority_queue<Vecin, vector<Vecin>, greater<Vecin> > PQ;
	PQ.push({ 0,start });
	cost[start] = 0;
	while (!PQ.empty())
	{
		int v = PQ.top().second;
		PQ.pop();
		if (!Viz[v])
		{
			Viz[v] = true;
			for (pair<int, int> x : G[v])
			{
				int vec = x.first, c = x.second;
				if (!Viz[vec] and cost[vec] > c)
				{
					if (cost[vec] != oo)
						cmin -= cost[vec];
					cmin += c;
					cost[vec] = c;
					PQ.push({ c,vec });
					P[vec] = v;
				}
			}
		}
	}
}
void write()
{
	cout << cmin << '\n';
	for (int i = 1; i <= n; i++)
		if (i != start)
			cout << '(' << P[i] << ',' << i << ") ";
}
int main()
{
	read();
	Prim();
	write();
}*/
//Exercitii
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
ifstream fin("harta3.in");
ofstream fout("harta3.out");
#define Punct pair<int,int>
vector<pair<float, Punct> > Edges;
vector<int> MST, P, Height;
vector<Punct> v;
int n;
float Weight = 0;
void read()
{
	fin >> n;
	v.resize(n);
	P.resize(n + 1);
	Height.resize(n + 1);
	for (int i = 1;i <= n;i++)
		P[i] = i;
	for (int i = 0;i < n;i++)
		fin >> v[i].first >> v[i].second;
	for (int i = 0;i < n - 1;i++)
		for (int j = i + 1;j < n;j++)
		{
			float cost = sqrt(pow(v[i].first - v[j].first, 2) + pow(v[i].second - v[j].second, 2));
			Edges.push_back({ cost,{i + 1,j + 1} });
		}
}
int get_Parent(int x)
{
	if (P[x] == x)
		return x;
	return get_Parent(P[x]);
}
void Kruskal()
{
	int M = 0, Pfirst, Psecond;
	while (MST.size() < n - 1)
	{
		Pfirst = get_Parent(Edges[M].second.first);
		Psecond = get_Parent(Edges[M].second.second);
		if (Pfirst != Psecond)
		{
			MST.push_back(M);
			if (Height[Pfirst] > Height[Psecond])
				P[Psecond] = Pfirst;
			else
				P[Pfirst] = Psecond;
			if (Height[Pfirst] == Height[Psecond])
				Height[Psecond]++;
			Weight += Edges[M].first;
		}
		M++;
	}
}
int main()
{
	read();
	sort(Edges.begin(), Edges.end());
	Kruskal();
	fout << Weight;
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("zapada.in");
ofstream fout("zapada.out");
vector<pair<pair<int, bool>, pair<int, int> > > Edges;
vector<int> P, MST, Height;
int n, m, Weight = 0;
bool CRT(pair<pair<int, bool>, pair<int, int> > a, pair<pair<int, bool>, pair<int, int> > b)
{
	if (a.first.second == b.first.second)
		return a.first.first < b.first.first;
	return a.first.second > b.first.second;
}
void read()
{
	fin >> n >> m;
	P.resize(n + 1);
	Height.resize(n + 1);
	for (int i = 1;i <= n;i++)
		P[i] = i;
	for (int i = 0;i < m;i++)
	{
		int x, y, c;
		fin >> x >> y >> c;
		Edges.push_back({ {c,0},{x,y} });
	}
	int k;
	fin >> k;
	for (int i = 1;i <= k;i++)
	{
		int x;
		fin >> x;
		Edges[x - 1].first.second = true;
	}
}
int get_Parent(int x)
{
	if (P[x] == x)
		return x;
	return get_Parent(P[x]);
}
void Kruskal()
{
	int M = 0, Pfirst, Psecond;
	while (M < m)
	{
		Pfirst = get_Parent(Edges[M].second.first);
		Psecond = get_Parent(Edges[M].second.second);
		if (Pfirst != Psecond)
		{
			MST.push_back(M);
			if (Height[Pfirst] > Height[Psecond])
				P[Psecond] = Pfirst;
			else
				P[Pfirst] = Psecond;
			if (Height[Pfirst] == Height[Psecond])
				Height[Psecond]++;
			Weight += Edges[M].first.first;
		}
		M++;
	}
}
int main()
{
	read();
	sort(Edges.begin(), Edges.end(), CRT);
	Kruskal();
	fout << Weight;
}*/

//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
ifstream fin("vacanta2020.in");
ofstream fout("vacanta2020.out");
#define Pair pair<int,int>
#define oo 0x3f3f3f3f
vector<vector<Pair> > G;
vector<int> cost, pred, v;
int n, m, k;
bool CRT(int a, int b)
{
	return a > b;
}
void read()
{
	fin >> n >> m >> k;
	G.resize(n + 1);
	pred.resize(n + 1);
	cost.resize(n + 1, oo);
	int x, y, c;
	while (fin >> x >> y >> c)
	{
		G[x].push_back({ y,c });
		G[y].push_back({ x,c });
	}
}
void Dijkstra()
{
	priority_queue<Pair, vector<Pair>, greater<Pair> > PQ;
	PQ.push({ 0,1 });
	cost[1] = 0;
	while (!PQ.empty())
	{
		for (Pair t : G[PQ.top().second])
			if (cost[t.first] > cost[PQ.top().second] + t.second)
			{
				cost[t.first] = cost[PQ.top().second] + t.second;
				PQ.push({ cost[t.first] , t.first });
				pred[t.first] = PQ.top().second;
			}
		PQ.pop();
	}
}
void get_v(int x, int i)
{
	if (pred[x])
	{
		get_v(pred[x], i);
		for (Pair t : G[i])
			if (t.first == x)
			{
				v.push_back(t.second);
				break;
			}
	}
	else
		for (Pair t : G[i])
			if (t.first == x)
			{
				v.push_back(t.second);
				break;
			}
}
int main()
{
	read();
	Dijkstra();
	for (int i = 2;i <= n;i++)
	{
		v.clear();
		get_v(i, i);
		sort(v.begin(), v.end(), CRT);
		int sz = v.size(), s = 0;
		for (int j = k;j < sz;j++)
			s += v[j];
		cost[i] = s;
	}
	for (int i = 1;i <= n;i++)
		fout << cost[i] << ' ';
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
ifstream fin("elicoptere.in");
ofstream fout("elicoptere.out");
bool CRT(pair<double, pair<int, int> > a, pair<double, pair<int, int> > b)
{
	return a.first < b.first;
}
vector<pair<double, pair<int, int> > > Edges;
vector<pair<pair<pair<int, int>, pair<int, int>>, pair<int, int> > > v;
vector<int> P, Height, MST;
short V;
int n, k;
double Distance = 0;
void read()
{
	fin >> V >> n >> k;
	P.resize(n + 1);
	Height.resize(n + 1);
	for (int i = 1;i <= n;i++)
		P[i] = i;
	for (int i = 1;i <= n;i++)
	{
		int x1, x2, x3, y1, y2, y3;
		fin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
		v.push_back({ {{x1,y1},{x2,y2} }, { x3,y3 } });
	}
	for (int i = 0;i < n;i++)
		for (int j = i + 1;j < n;j++)
		{
			int xi1 = v[i].first.first.first, yi1 = v[i].first.first.second;
			int xj1 = v[j].first.first.first, yj1 = v[j].first.first.second;
			int xi2 = v[i].first.second.first, yi2 = v[i].first.second.second;
			int xj2 = v[j].first.second.first, yj2 = v[j].first.second.second;
			int xi3 = v[i].second.first, yi3 = v[i].second.second;
			int xj3 = v[j].second.first, yj3 = v[j].second.second;
			double cost11 = abs(xi1 - xj1) + abs(yi1 - yj1);
			double cost12 = abs(xi1 - xj2) + abs(yi1 - yj2);
			double cost13 = abs(xi1 - xj3) + abs(yi1 - yj3);
			double cost21 = abs(xi2 - xj1) + abs(yi2 - yj1);
			double cost22 = abs(xi2 - xj2) + abs(yi2 - yj2);
			double cost23 = abs(xi2 - xj3) + abs(yi2 - yj3);
			double cost31 = abs(xi3 - xj1) + abs(yi3 - yj1);
			double cost32 = abs(xi3 - xj2) + abs(yi3 - yj2);
			double cost33 = abs(xi3 - xj3) + abs(yi3 - yj3);
			if (cost11 > cost12)
				cost11 = cost12;
			if (cost11 > cost13)
				cost11 = cost13;
			if (cost11 > cost21)
				cost11 = cost21;
			if (cost11 > cost22)
				cost11 = cost22;
			if (cost11 > cost23)
				cost11 = cost23;
			if (cost11 > cost31)
				cost11 = cost31;
			if (cost11 > cost32)
				cost11 = cost32;
			if (cost11 > cost33)
				cost11 = cost33;
			Edges.push_back({ cost11,{i + 1,j + 1} });
		}
}
int getP(int x)
{
	if (P[x] == x)
		return x;
	return getP(P[x]);
}
void Kruskal()
{
	int M = 0, Pfirst, Psecond;
	while (MST.size() < n - 1)
	{
		Pfirst = getP(Edges[M].second.first);
		Psecond = getP(Edges[M].second.second);
		if (Pfirst != Psecond)
		{
			MST.push_back(M);
			Distance += Edges[M].first;
			if (Height[Pfirst] > Height[Psecond])
				P[Psecond] = Pfirst;
			else
				P[Pfirst] = Psecond;
			if (Height[Pfirst] == Height[Psecond])
				Height[Psecond]++;
		}
		M++;
	}
}
int get_v1()
{
	int nr = 0;
	for (int t : MST)
	{
		int x = Edges[t].second.first, y = Edges[t].second.second;
		if (k >= Edges[t].first)
				nr++;
	}
	return nr;
}
vector<bool> viz;
vector<vector<int> > G;
void dfs(int x, int& nr)
{
	viz[x] = true;
	nr++;
	for (int t : G[x])
		if (!viz[t])
		{
			dfs(t, nr);
		}
}
int get_v2()
{
	int s = 0;
	G.resize(n + 1);
	viz.resize(n + 1);
	for (int t : MST)
		if (k >= Edges[t].first)
		{
			G[Edges[t].second.first].push_back(Edges[t].second.second);
			G[Edges[t].second.second].push_back(Edges[t].second.first);
		}
	for (int t : MST)
		if (!viz[Edges[t].second.first] and k >= Edges[t].first)
		{
			int nr = 0;
			dfs(t, nr);
			s += nr * (nr - 1) / 2;
		}
	return s;
}
int main()
{
	read();
	sort(Edges.begin(), Edges.end(), CRT);
	Kruskal();
	if (V == 1)
		fout << get_v1();
	else
		if (V == 2)
			fout << get_v2();
}*/
/*#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define Pair pair<int,int>
#define oo 0x3f3f3f3f
vector<vector<Pair> > G;
vector<int> road, cost;
short c;
int n, m;
void read()
{
	cin >> c >> n >> m;
	G.resize(n + 1);
	road.resize(n + 1, oo);
	int x, y, d;
	for (int i = 1;i <= m;i++)
	{
		cin >> x >> y >> d;
		G[y].push_back({ x,d });
	}
}
void Dijkstra(int start)
{
	cost.clear();
	cost.resize(n + 1, oo);
	priority_queue<Pair, vector<Pair>, greater<Pair> > PQ;
	PQ.push({ 0,start });
	cost[start] = 0;
	while (!PQ.empty())
	{
		for (Pair t : G[PQ.top().second])
			if (cost[t.first] > cost[PQ.top().second] + t.second)
			{
				cost[t.first] = cost[PQ.top().second] + t.second;
				PQ.push({ cost[t.first],t.first });
			}
		PQ.pop();
	}
}
int main()
{
	read();
	vector<int> resedinta;
	for (int i = 1;i <= n;i++)
	{
		Dijkstra(i);
		bool ok = true;
		for (int j = 1;j <= n and ok;j++)
			if (cost[j] == oo)
				ok = false;
		if (ok)
		{
			resedinta.push_back(i);
			for (int j = 1;j <= n;j++)
				if (road[j] > cost[j])
					road[j] = cost[j];
		}
	}
	if (c == 1)
		for (int t : resedinta)
			cout << t << ' ';
	else
		for (int i = 1;i <= n;i++)
			cout << road[i] << ' ';
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("graf.txt");
vector<vector<int> > G;
vector<int> nivel;
int n;
void read()
{
	fin >> n;
	G.resize(n + 1);
	nivel.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void dfs(int x, int niv)
{
	nivel[x] = niv;
	for (int vec : G[x])
		if (!nivel[vec])
			dfs(vec, niv + 1);
}
int main()
{
	read();
	dfs(1, 1);
	for (int i = 1;i <= n;i++)
		cout << i << " : " << nivel[i] << '\n';
}*/

/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("graf.txt");
vector<vector<int> > G;
vector<int> nivel;
int n;
void read()
{
	fin >> n;
	G.resize(n + 1);
	nivel.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void dfs(int x, int niv)
{
	nivel[x] = niv;
	for (int vec : G[x])
		if (!nivel[vec])
			dfs(vec, niv + 1);
}
int main()
{
	read();
	dfs(1, 1);
	for (int i = 1;i <= n;i++)
		cout << i << " : " << nivel[i] << '\n';
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("graf.txt");
vector<vector<int> > G;
vector<int> nivel, tata;
int n;
void read()
{
	fin >> n;
	G.resize(n + 1);
	tata.resize(n + 1);
	nivel.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void dfs(int x, int niv)
{
	nivel[x] = niv;
	for (int vec : G[x])
		if (!nivel[vec])
		{
			tata[vec] = x;
			dfs(vec, niv + 1);
		}
}
bool is_leaf(int x)
{
	for (int i = 1;i <= n;i++)
		if (tata[i] == x)
			return 0;
	return 1;
}
void print_chain(int x)
{
	if (x)
	{
		print_chain(tata[x]);
		cout << x << ' ';
	}
}
int main()
{
	read();
	dfs(1, 1);
	for (int i = 1;i <= n;i++)
		cout << i << " : " << nivel[i] << '\n';
	cout << '\n';
	for (int i = 1;i <= n;i++)
		cout << i << " : " << tata[i] << '\n';
	cout << endl;
	for (int i = 1;i <= n;i++)
		if (is_leaf(i))
		{
			print_chain(i);
			cout << endl;
		}
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("graf.txt");
vector<vector<int> > G;
vector<int> nivel, v;
int n;
void read()
{
	fin >> n;
	G.resize(n + 1);
	v.resize(n + 1);
	nivel.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void dfs(int x, int niv)
{
	nivel[x] = niv;
	v[niv] = x;
	for (int i = 1;i <= niv;i++)
		cout << v[i] << ' ';
	cout << endl;
	for (int vec : G[x])
		if (!nivel[vec])
			dfs(vec, niv + 1);
}
int main()
{
	read();
	dfs(1, 1);
}*/
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("graf.txt");
vector<vector<int> > G;
vector<int> nivel, v;
int n;
void read()
{
	fin >> n;
	G.resize(n + 1);
	v.resize(n + 1);
	nivel.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void dfs(int x, int niv)
{
	nivel[x] = niv;
	v[niv] = x;
	for (int vec : G[x])
		if (!nivel[vec])
			dfs(vec, niv + 1);
	for (int i = 1;i <= niv;i++)
		cout << v[i] << ' ';
	cout << endl;
}
int main()
{
	read();
	dfs(1, 1);
}*/
//Pointers
/*#include<iostream>
using namespace std;
int n;
int* V;
int* find(int* p, int x)
{
	if (*p == x)
		return p;
	if (p - V == n)
		return 0;
	return find(p + 1, x);
}
int main()
{
	cin >> n;
	V = new int[n];
	for (int* p = V;p - V < n;p++)
		cin >> *p;
	cout << find(V, 12) - V;
}*/

//Tema
/*#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("sediu.in");
ofstream fout("sediu.out");
vector<vector<int> > G;
vector<int> level, vf;
int n, minlvl, maxlvl;
void read()
{
	fin >> n;
	minlvl = n;
	G.resize(n + 1);
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void bfs(int x, int lvl)
{
	level[x] = lvl;
	if (maxlvl < lvl)
		maxlvl = lvl;
	for (int t : G[x])
		if (!level[t])
			bfs(t, lvl + 1);
}
int main()
{
	read();
	for (int i = 1;i <= n;i++)
	{
		maxlvl = 0;
		level.clear();
		level.resize(n + 1);
		bfs(i, 1);
		if (minlvl > maxlvl - 1)
		{
			minlvl = maxlvl - 1;
			vf.clear();
			vf.push_back(i);
		}
		else
			if (minlvl == maxlvl)
				vf.push_back(i);
	}
	fout << minlvl << ' ' << vf.size() << '\n';
	for (int i : vf)
		fout << i << ' ';
}*/
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
vector<vector<int> > G;
vector<int> v, level, chain;
int n, smax = 0;
void read()
{
	fin >> n;
	G.resize(n + 1);
	v.resize(n + 1);
	level.resize(n + 1);
	chain.resize(n + 1);
	for (int i = 1;i <= n;i++)
		fin >> v[i];
	int x, y;
	while (fin >> x >> y)
	{
		G[x].push_back(y);
		G[y].push_back(x);
	}
}
void bfs(int x,int lvl)
{
	level[x] = lvl;
	chain[lvl] = x;
	for (int k = 1;k < lvl;k++)
	{
		int s = 0;
		for (int i = k;i <= lvl;i++)
			s += v[i];
		if (smax < s)
			smax = s;
	}
	for (int t : G[x])
		if (!level[t])
			bfs(t, lvl + 1);
}
int main()
{
	read();
	bfs(1, 1);
	fout << smax;
}