Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- #include <set>
- #include <map>
- #include <unordered_map>
- #include <unordered_set>
- #include <queue>
- #include <deque>
- #include <stack>
- #include <cmath>
- #include <numeric>
- #include <algorithm>
- #include <random>
- #include <fstream>
- #include <iomanip>
- #include <limits>
- #include <bitset>
- #include <ostream>
- #include <sstream>
- #include <cstring>
- #include <cassert>
- using namespace std;
- /// Pragmas ///
- //#pragma GCC optimize("Ofast")
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
- //#pragma GCC optimize("unroll-loops")
- /// define ///
- #define pii pair<int,int>
- #define V vector
- #define MP make_pair
- #define vi vector<int>
- #define ff first
- #define ss second
- #define vl vector<long long>
- /// typedef ///
- typedef long long ll;
- typedef long double ld;
- /// solve ///
- #define int long long
- // consts
- const double PI = acos(-1);
- const ll MOD = 1000000007;
- const ll MOD2 = 1000000009;
- //const int p = 239;
- const long long inf = 1000000000 + 9;
- const int N = 150000+5000;
- const double eps = 1e-18;
- int dx[8] = {1,0,-1,0,1,-1,-1,1};
- int dy[8] = {0,1,0,-1,1,1,-1,-1};
- //vector <int> cl(N);
- //vector <vector <int>> g(N);
- //vector <bool> used(N);
- //vector <int> dist(N);
- //vector <bool> blocked(N);
- //vector <bool> stop(N);
- //// ----------------------- DFS ------------------------------
- //void dfs(int v) {
- // used[v] = true;
- // if (g[v].size() == 1) {
- // int i = q[v].first;
- // int j = q[v].second;
- // ans.push_back({i, j});
- // return;
- // }
- // for (int i = 0; i < g[v].size(); ++i) {
- // int u = g[v][i];
- // if (!used[u])
- // dfs(u);
- // }
- //}
- // ----------------------- END DFS ------------------------------
- // ----------------------- BFS ------------------------------
- ////vector <vector <ll>> g(N);
- //bool used[N];
- //bool used2[1000][1000];
- //ll dist[100][1e5];
- //map <pair<int,int>,int> m1;
- //void bfs(ll x, ll y, vector<vector<char>> &edge, int n, int x2, int y2) {
- // m1[{x,y}]++;
- // queue <pair<int,int>> q;
- // q.push({x,y});
- // while (!q.empty()) {
- // pair<int,int> v = q.front();
- // q.pop();
- // if (v.first == x2 && v.second == y2) {
- // return;
- // }
- // int sz1 = edge[v.first].size();
- // for (int i = 0; i < 4; ++i) {
- // if (v.second + dy[i] < 0 || v.first +dx[i] >= n || v.first + dx[i] < 0 || m1[{v.first + dx[i], v.second + dy[i]}] != 0) continue;
- // if (edge[v.first].size() <= v.second) continue;
- // int sz2 = edge[v.first + dx[i]].size();
- // if (sz1 == sz2) {
- // m1[{v.first+dx[i],v.second+dy[i]}]++;
- // dist[v.first+dx[i]][v.second+dy[i]] = dist[v.first][v.second] + 1;
- // q.push({v.first+dx[i], v.second+dy[i]});
- // } else if (sz1 > sz2 && dx[i] == -1) { // up
- // if (v.second + dy[i] >= sz2 && !used2[v.first+dx[i]][sz2-1]) {
- // used2[v.first+dx[i]][sz2-1] = true;
- // dist[v.first+dx[i]][sz2-1] = dist[v.first][v.second] + 1;
- // q.push({v.first+dx[i], sz2-1});
- // } else {
- // if (used2[v.first+dx[i]][v.second+dy[i]]) continue;
- // m1[{v.first+dx[i],v.second+dy[i]}]++;
- // dist[v.first+dx[i]][v.second+dy[i]] = dist[v.first][v.second] + 1;
- // q.push({v.first+dx[i], v.second + dy[i]});
- // }
- // } else if (sz1 > sz2 && dx[i] == 1) { // down
- // if (v.second + dy[i] >= sz2 && !used2[v.first+dx[i]][sz2-1]) {
- // used2[v.first+dx[i]][sz2-1] = true;
- // dist[v.first+dx[i]][sz2-1] = dist[v.first][v.second] + 1;
- // q.push({v.first+dx[i], sz2-1});
- // } else {
- // if (used2[v.first+dx[i]][v.second+dy[i]]) continue;
- // m1[{v.first+dx[i],v.second+dy[i]}]++;
- // dist[v.first+dx[i]][v.second+dy[i]] = dist[v.first][v.second] + 1;
- // q.push({v.first+dx[i], v.second + dy[i]});
- // }
- // } else {
- // m1[{v.first+dx[i],v.second+dy[i]}]++;
- // dist[v.first+dx[i]][v.second+dy[i]] = dist[v.first][v.second] + 1;
- // q.push({v.first+dx[i], v.second+dy[i]});
- // }
- //// if (dist[18][5] != 0) {
- //// cout << 1;
- //// }
- // }
- // }
- //}
- // ----------------------- END BFS ------------------------------
- // ----------------------- GEN PERMUNTATION ------------------------------
- //vector <int> cur;
- //void gen(int n, int pos) {
- // if (pos == n) {
- // for (int i = 0; i < n; ++i) {
- // cout << cur[i] << ' ';
- // }
- // cout << '\n';
- // return;
- // } else {
- // for (int i = 1; i <= n; ++i) {
- // if (!used[i]) {
- // used[i] = true;
- // cur.push_back(i);
- // gen(n, pos + 1);
- // cur.pop_back();
- // used[i] = false;
- // }
- // }
- // }
- //}
- //
- //
- // ----------------------- END GEN PERMUNTATION ------------------------------
- // ----------------------- GCD & LCM ------------------------------
- ll gcd(ll a, ll b) {
- return (b ? gcd(b, a%b) : a);
- }
- ll lcm(ll a, ll b) {
- return a / gcd(a, b) * b;
- }
- //// ----------------------- END GCD & LCM ------------------------------
- //
- //
- //double euclid(int x1, int y1, int x2, int y2) {
- // return sqrt(abs((x2-x1) * (x2-x1)) + abs((y2-y1) * (y2-y1)));
- //}
- //
- //
- //// ----------------------- SIEVE ------------------------------
- //vector<bool> isPrime(1e6 + 7, true);
- //void sieve(){
- // isPrime[0] = isPrime[1] = false;
- // for(int i = 2; i * i <= 1e6 + 7; ++i){
- // if(isPrime[i]){
- // for(int j = i * i; j <= 1e5 + 7; j += i)
- // isPrime[j] = false;
- // }
- // }
- //}
- //// ----------------------- END SIEVE ------------------------------
- //
- //
- //// ----------------------- CountDivisors ------------------------------
- //int countDivisors(int n){
- // int ans = 2;
- // for(int i = 2; i * i <= n; i++){
- // if(n % i == 0) ans += 2;
- // if(i*i == n) ans--;
- // }
- // return ans;
- //}
- //// ----------------------- END CountDivisors ------------------------------
- //
- //// ----------------------- RETURN PRIME FACTORS VECTOR ------------------------------
- //vector <ll> fact(ll n) {
- // vector <ll> f;
- // for (int i = 2; i * i <= n; ++i)
- // while (n % i == 0) f.push_back(i), n /= i;
- // if (n > 1) f.push_back(n);
- // return f;
- //}
- //
- //vector<ll> priFactors(ll a){
- // vector<ll> answer;
- // while(a%2==0){
- // answer.push_back(2);
- // a/=2;
- // }
- // for(int i=3; i*i<=a; i+=2){
- // while(a%i == 0){
- // answer.push_back(i);
- // a /= i;
- // }
- // }
- // if(a>2) answer.push_back(a);
- // return answer;
- //}
- //// ----------------------- END RETURN PRIME FACTORS VECTOR ------------------------------
- //
- //
- //// ----------------------- VECTORS FOR GEOMETRY ------------------------------
- //typedef double T;
- //struct Vector {
- // T x, y;
- // Vector(T x=0, T y=0) : x(x), y(y) {}
- // Vector(Vector a, Vector b) : x(b.x - a.x), y(b.y - a.y) {}
- //
- // Vector operator-(const Vector& a) const {
- // return {x - a.x, y - a.y};
- // }
- // T len2() {
- // return x*x + y*y;
- // }
- // T len() {
- // return sqrt(len2());
- // }
- // //|A| * |B| * cos
- // //|A| * |B| * sin
- // T Dpr(const Vector& b) const {
- // return x * b.x + y * b.y;
- // }
- // T Cpr(const Vector& b) const {
- // return x*b.y - b.x*y;
- // }
- //};
- // ----------------------- END VECTORS FOR GEOMETRY ------------------------------
- // ----------------------- DIJKSTRA ------------------------------
- //
- ////vector <vector <pair<ll,ll>>> g(500); // w, from, to;
- ////vector <ll> dist(100100, inf);
- ////vector <ll> p(100100, inf);
- ////vector <bool> used(100100);
- ////vector <ll> path;
- ////vector <ll> par(500);
- ////vector <ll> lh(500);
- //
- //
- ////void dijkstra(ll s) {
- //// dist[s] = 0;
- //// set <pair<ll,ll>> q;
- //// q.emplace(dist[s], s);
- //// while (!q.empty()) {
- //// ll v = q.begin()->second;
- //// q.erase(q.begin());
- //// for (int i = 0; i < g[v].size(); ++i) {
- //// ll u = g[v][i].second;
- //// ll len = g[v][i].first;
- //// if (dist[u] < dist[v] + len) {
- //// q.erase({dist[u], u});
- //// dist[u] = dist[v] + len;
- //// q.emplace(dist[u], u);
- //// }
- //// }
- //// }
- ////}
- // ----------------------- END DIJKSTRA ------------------------------
- // ----------------------- DSU ------------------------------
- //vector <int> dsu_par(1e5+50000);
- //vector <int> dsu_sz(1e5+50000);
- //
- //ll dsu_setId(ll v) {
- // if (dsu_par[v] == v)
- // return v;
- // else
- // return dsu_par[v] = dsu_setId(dsu_par[v]);
- //}
- //
- //void dsu_union(ll a, ll b) {
- // ll x = dsu_setId(a);
- // ll y = dsu_setId(b);
- // if (dsu_sz[x] < dsu_sz[y])
- // swap(x,y);
- // dsu_par[x] = y;
- // dsu_sz[x] += dsu_sz[y];
- //}
- //
- //bool dsu_check(ll a, ll b) {
- // if (dsu_setId(a) == dsu_setId(b)) {
- // return true;
- // } else {
- // return false;
- // }
- //}
- // ----------------------- END DSU ------------------------------
- // ----------------------- Queue with min ------------------------------
- //struct Queue {
- // stack <int> st1, st2, st1_min, st2_min;
- // void push(int x) {
- // st1.push(x);
- // if (st1_min.empty())
- // st1_min.push(x);
- // else
- // st1_min.push(min(st1_min.top(), x));
- // }
- // void del_e() {
- // if (st1_min.empty() && st2_min.empty()) return;
- // if (!st2.empty()) {
- // st2.pop();
- // st2_min.pop();
- // return;
- // }
- // while (!st1.empty()) {
- // st2.push(st1.top());
- // if (st2_min.empty())
- // st2_min.push(st1.top());
- // else
- // st2_min.push(min(st2_min.top(), st1.top()));
- // st1.pop();
- // st1_min.pop();
- // }
- // st2.pop();
- // st2_min.pop();
- // }
- // int get_min() {
- // if (st1_min.empty() && st2_min.empty()) {
- // return -1;
- // } else if (st1_min.empty()) {
- // return st2_min.top();
- // } else if (st2_min.empty()) {
- // return st1_min.top();
- // } else {
- // return min(st1_min.top(), st2_min.top());
- // }
- // }
- //};
- // ----------------------- END Queue with min ------------------------------
- // ----------------------- BINPOW ------------------------------
- //int binPow(int x, int n) {
- // if (n == 0) {
- // return 1;
- // } else {
- // if (n % 2 == 0) {
- // int a = binPow(x, n/2);
- // return (a*a);
- // } else {
- // return ((binPow(x, n-1) * x));
- // }
- // }
- //}
- //// ----------------------- END BINPOW ------------------------------
- //bool Prime(int n)
- //{
- // if (n <= 1)
- // return false;
- // if (n <= 3)
- // return true;
- // if (n % 2 == 0 || n % 3 == 0)
- // return false;
- //
- // for (int i = 5; i * i <= n; i = i + 6)
- // if (n % i == 0 || n % (i + 2) == 0)
- // return false;
- //
- // return true;
- //}
- //bool t[1000000+1000];
- //int f(int n, int x, vl &a) {
- // if (x >= 0 && t[x]) {
- // return dp[x];
- // } else if (x == 0) {
- // return 1;
- // } else if (x < 0) {
- // return 0;
- // } else {
- // ll sum = 0;
- // for (int i = 0; i < n; ++i) {
- // sum += f(n, x-a[i], a);
- // }
- // return sum;
- // }
- //}
- //struct Tree {
- // vector <char> t;
- // ll size;
- // void init(ll n) {
- // size = 1;
- // while (size < n) size *= 2;
- // t.assign(2*size-1, 'z');
- // }
- //
- //
- //
- // void set(ll i, ll v, ll x, ll lx, ll rx) {
- // if (rx-lx == 1) {
- // t[x] = v;
- // return;
- // } else {
- // ll m = (lx + rx)/2;
- // if (i < m) {
- // set(i, v, 2*x+1, lx, m);
- // } else {
- // set(i, v, 2*x+2, m, rx);
- // }
- // t[x] = min(t[2*x+1], t[2*x+2]);
- // }
- // }
- //
- // void set(ll i, ll v) {
- // set(i, v, 0, 0, size);
- // }
- //
- // char mn(int l, int r, int x, int lx, int rx) {
- // if (l >= rx || lx >= r) {
- // return 'z';
- // }
- // if (lx >= l && rx <= r) {
- // return t[x];
- // }
- // ll m = (lx + rx) / 2;
- // ll s1 = mn(l, r, 2 * x + 1, lx, m);
- // ll s2 = mn(l, r, 2 * x + 2, m, rx);
- // return min(s1, s2);
- // }
- //
- // char mn(int l, int r) {
- // return mn(l, r, 0, 0, size);
- // }
- //
- //};
- //
- //struct segtree {
- //
- //// struct node {
- //// int seg;
- //// int pref;
- //// int suf;
- //// int sum;
- //// };
- //
- // vector <int> tree;
- // int size;
- //
- //// node combine(node a, node b) {
- //// return {
- //// max(a.seg, max(b.seg, a.suf + b.pref)),
- //// max(a.pref, a.sum + b.pref),
- //// max(b.suf, b.sum + a.suf),
- //// a.sum + b.sum
- //// };
- //// }
- //
- // //const node zero = {0, 0, 0, 0};
- //
- // void init(int n) {
- // size = 1;
- // while (size < n) size*=2;
- // tree.resize(size * 2 - 1, 0);
- // }
- //
- //// void build(vector <int>& a, int x, int lx, int rx) {
- //// if (rx - lx == 1) {
- //// if (lx < a.size()) {
- //// tree[x] = {
- //// (a[lx] > 0 ? a[lx] : 0),
- //// (a[lx] > 0 ? a[lx] : 0),
- //// (a[lx] > 0 ? a[lx] : 0),
- //// a[lx]
- //// };
- //// }
- //// return;
- //// }
- //// int m = (rx + lx)/2;
- //// build(a, 2*x+1, lx, m);
- //// build(a, 2*x+2, m, rx);
- //// tree[x] = combine(tree[2*x+1], tree[2*x+2]);
- //// }
- ////
- //// void build(vector <int>& a) {
- //// init(a.size());
- //// build(a, 0, 0, size);
- //// }
- //
- // void push(int x, int lx, int rx) {
- // if (rx - lx != 1) {
- // int m = (lx+rx)/2;
- // int len1 = m-lx+1;
- // int len2 = rx-m+1;
- // add[2*x+1] = add[2*x+2] = add[x];
- // if (add[x]) {
- // tree[2*x+1] = add[x];
- // tree[2*x+2] = add[x];
- // }
- // add[x] = 0;
- // }
- // }
- //
- // void set(int l, int r, int v, int x, int lx, int rx) {
- // push(x, lx, rx);
- // if (l >= rx || lx >= r) {
- // return;
- // }
- // if (lx >= l && rx <= r) {
- // tree[x] = v * (rx-lx);
- // add[x] = v;
- // return;
- // }
- // int m = (lx + rx)/2;
- // set(l, r, v, 2*x+1, lx, m);
- // set(l, r, v, 2*x+2, m, rx);
- // }
- //
- // void set(int l, int r, int v) {
- // set(l, r, v, 0, 0, size);
- // }
- //
- // int get_sum(int l, int r, int x, int lx, int rx) {
- // if (lx >= r || rx <= l) {
- // return 0;
- // }
- // if (lx >= l && rx <= r) {
- // return tree[x];
- // }
- // int m = (lx + rx)/2;
- // int sum1 = get_sum(l, r, 2*x+1, lx, m);
- // int sum2 = get_sum(l, r, 2*x+2, m, rx);
- // return sum1 + sum2;
- // }
- //
- // int get_sum(int l, int r) {
- // return get_sum(l, r, 0, 0, size);
- // }
- //
- //};
- struct Vector {
- int x, y;
- Vector() {}
- Vector(int x1, int y1) {
- x = x1;
- y = y1;
- }
- Vector(Vector a, Vector b) {
- x = b.x - a.x;
- y = b.y - a.y;
- }
- Vector operator+(Vector other) const {
- return Vector(x + other.x, y + other.y);
- }
- Vector operator-(Vector other) const {
- return Vector(x - other.x, y - other.y);
- }
- Vector operator*(int d) {
- return Vector(x * d, y * d);
- }
- long long operator*(Vector other) const {
- return x * other.x + y * other.y;
- }
- long long operator^(Vector other) const {
- return x * other.y - y * other.x;
- }
- long long len2() {
- return x * x + y * y;
- }
- long long len() {
- return sqrt(len2());
- }
- };
- typedef Vector Point;
- double Angle(Vector a, Vector b) {
- return atan2(a ^ b, a * b);
- }
- double Dist(Vector a, Vector b) {
- return Vector(a, b).len();
- }
- double Area(Point a, Point b, Point c) {
- Vector ab(a, b);
- Vector ac(a, c);
- return (double) abs(ab ^ ac) / 2;
- }
- istream &operator>>(istream &in, Point &p) {
- in >> p.x >> p.y;
- return in;
- }
- ostream &operator<<(ostream &out, Point p) {
- out << p.x << ' ' << p.y;
- return out;
- }
- void solve() {
- }
- signed main() {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- // freopen("","r",stdin);
- // freopen("","w",stdout);
- int t = 1; // cin >> t;
- while (t--) solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement