From a4a3f8e87a4d49d63182c3362361e70e53197ff3 Mon Sep 17 00:00:00 2001 From: RinRi Date: Tue, 6 Apr 2021 09:49:22 +0600 Subject: [PATCH] recreating algo repository --- binary-search/binary-search.cpp | 29 ++++++ data-structures/dk-dereva.cpp | 112 +++++++++++++++++++++ data-structures/fenwick.cpp | 94 ++++++++++++++++++ data-structures/painters.cpp | 103 ++++++++++++++++++++ data-structures/rycarski_turnir356a.cpp | 59 ++++++++++++ data-structures/segtreecolminupdx.cpp | 123 ++++++++++++++++++++++++ data-structures/segtreekth.cpp | 99 +++++++++++++++++++ data-structures/segtreeminupdx.cpp | 99 +++++++++++++++++++ data-structures/segtreesufpref.cpp | 96 ++++++++++++++++++ data-structures/segtreesumupdlr.cpp | 117 ++++++++++++++++++++++ data-structures/segtreesumupdx.cpp | 99 +++++++++++++++++++ data-structures/sparse-table.cpp | 61 ++++++++++++ graphs/bridges.cpp | 71 ++++++++++++++ graphs/cutpoints.cpp | 61 ++++++++++++ graphs/dijkstra.cpp | 56 +++++++++++ graphs/lca.cpp | 62 ++++++++++++ graphs/maxflow.cpp | 71 ++++++++++++++ graphs/unionday.cpp | 73 ++++++++++++++ math/combinatorics.cpp | 91 ++++++++++++++++++ math/meet-in-the-middle.cpp | 59 ++++++++++++ math/pascaltriangle.cpp | 20 ++++ math/two-turtles.cpp | 118 +++++++++++++++++++++++ other/ioi-ideas.pdf | Bin 0 -> 26400 bytes 23 files changed, 1773 insertions(+) create mode 100755 binary-search/binary-search.cpp create mode 100755 data-structures/dk-dereva.cpp create mode 100755 data-structures/fenwick.cpp create mode 100644 data-structures/painters.cpp create mode 100755 data-structures/rycarski_turnir356a.cpp create mode 100644 data-structures/segtreecolminupdx.cpp create mode 100644 data-structures/segtreekth.cpp create mode 100644 data-structures/segtreeminupdx.cpp create mode 100644 data-structures/segtreesufpref.cpp create mode 100644 data-structures/segtreesumupdlr.cpp create mode 100644 data-structures/segtreesumupdx.cpp create mode 100755 data-structures/sparse-table.cpp create mode 100755 graphs/bridges.cpp create mode 100755 graphs/cutpoints.cpp create mode 100755 graphs/dijkstra.cpp create mode 100755 graphs/lca.cpp create mode 100755 graphs/maxflow.cpp create mode 100644 graphs/unionday.cpp create mode 100644 math/combinatorics.cpp create mode 100755 math/meet-in-the-middle.cpp create mode 100755 math/pascaltriangle.cpp create mode 100644 math/two-turtles.cpp create mode 100755 other/ioi-ideas.pdf diff --git a/binary-search/binary-search.cpp b/binary-search/binary-search.cpp new file mode 100755 index 0000000..3f02d18 --- /dev/null +++ b/binary-search/binary-search.cpp @@ -0,0 +1,29 @@ +#include +#include + +using namespace std ; + +int main() +{ + int n ; + cin >> n ; + int a[n] ; + for(int i = 0 ; i < n ; ++i) cin >> a[i] ; + sort(a,a+n) ; + int x ; + cin >> x ; + int l = 0 , r = n ; + while(r-l>1) + { + int mid = (r+l)/2 ; + if(a[mid] <= x) + l = mid ; + else r = mid ; + } + if(a[l]==x) + cout << l ; + else + cout << -1 ; +} + + diff --git a/data-structures/dk-dereva.cpp b/data-structures/dk-dereva.cpp new file mode 100755 index 0000000..6b55424 --- /dev/null +++ b/data-structures/dk-dereva.cpp @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include +#include + +#define pb push_back +#define ll long long +#define ub upper_bound +#define lb lower_bound +#define sc(x) scanf("%I64d",&x) +#define pr(x) printf("%I64d\n",x) + +using namespace std ; + +const int MAXN = 1e9+1 ; +const int N = 1e6+1 ; +int n , m , k , x , y , z ; +int a[N] , d[30][N] , U[N] ; + +struct node +{ + int x, sz, y ; + node *l, *r ; + node (int X = 0) + { + x = X ; + sz = 1 ; + y = rand () ; + l = r = NULL ; + } +} *t ; + +typedef node* pnode ; + +int GetSz (pnode t) +{ + if (!t) + return 0 ; + return t -> sz ; +} + +int GetKey(pnode t) +{ + if (!t) + return 0 ; + return GetSz (t -> l) + 1 ; +} + +void upd (pnode t) +{ + if (!t) + return ; + t -> sz = GetSz (t -> l) + GetSz (t -> r) + 1 ; +} + +pnode Merge (pnode a , pnode b) +{ + if (!a) + return b ; + if (!b) + return a ; + if (a -> y > b -> y) + { + a -> r = Merge ( a -> r , b ); + upd (a) ; + return a ; + } + else + { + b -> l = Merge ( a , b -> l ) ; + upd (b) ; + return b ; + } +} + +void Split (pnode t , pnode &a , pnode &b , int x) +{ + if (!t) + return void (a = b = NULL); + int key = GetKey (t) ; + if (key <= x) + { + Split ( t -> r , t -> r , b , x - key ) ; + a = t ; + } + else + { + Split ( t -> l , a , t -> l , x ) ; + b = t ; + } + upd (a) ; + upd (b) ; +} + +void add (int x) +{ + pnode L , R , M ; + L = R = M = NULL ; + Split ( t , L , R , x ) ; + Split ( L , L , M , x - 1 ) ; + M = Merge ( new node ( x ) , M ) ; + L = Merge ( L , M ) ; + t = Merge ( L , R ) ; +} + +int main() +{ + +} diff --git a/data-structures/fenwick.cpp b/data-structures/fenwick.cpp new file mode 100755 index 0000000..e7f140f --- /dev/null +++ b/data-structures/fenwick.cpp @@ -0,0 +1,94 @@ +#include + +#define F first +#define S second +#define pb(x) push_back(x) +#define iosb ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) +#define BIT(x) __builtin_popcount(x) + +using namespace std ; + +const int MAXN = 1e6+1 ; +const int MaxN = 1e5+1 ; +const int N = 1e4+1 ; +const int M = 1e3+1 ; +const int MOD = 1e9+7 ; +const int inf = 2e9+7 ; +const long long INF = 2e18+7 ; + +int t[MaxN] , n , a[MaxN] ; + +int sum(int v) +{ + int res = 0 ; + + if(v==-1) + return 0 ; + + for(; v > 0 ; v = (v & (v + 1)) - 1) + res += t[v] ; + + return res ; +} + +void upd(int pos , int delta) +{ + a[pos] += delta ; + for( ; pos < n ; pos |= pos+1) + t[pos] += delta ; +} + +/* +int get_min(int v) +{ + int res = inf ; + + for (; v >= 0; v = (v & (v + 1)) - 1) + res = min(res , f[v]) ; + + return res ; +} + +void assign(int pos, int delta) +{ + a[pos] = delta ; + + for (; pos < n ; pos |= pos + 1) + f[pos] = min(f[pos] , delta) ; +} +*/ + +main() +{ +// freopen(".in" , "r" , stdin) ; +// freopen(".out" , "w" , stdout) ; + cin >> n ; + + for(int i = 0 ; i < n ; ++i) + { + int x ; + cin >> x ; + upd(i , x) ; + } + /* + for(int i = 0 ; i < n ; ++i) + f[i] = inf ; + + for(int i = 0 ; i < n ; ++i) + { + int t ; + cin >> t ; + assign(i , t) ; + } + */ + int q ; + cin >> q ; + while(q--) + { + int l , r ; + cin >> l >> r ; + cout << sum(r-1) - sum(l-2) << '\n' ; + } + return 0 ; +} + diff --git a/data-structures/painters.cpp b/data-structures/painters.cpp new file mode 100644 index 0000000..1c46ad9 --- /dev/null +++ b/data-structures/painters.cpp @@ -0,0 +1,103 @@ +/* +#pragma GCC target ("avx2") +#pragma GCC optimize ("Ofast") +#pragma GCC optimize ("unroll-loops") +*/ +#include "bits/stdc++.h" + +#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) +#define BIT(x) __builtin_popcount(x) +#define all(x) x.begin() , x.end() +#define F first +#define S second +#define pb push_back + +using namespace std ; + +typedef unsigned long long UL ; +typedef long long L ; +typedef string T ; +typedef int I ; + +const I MaxN = 8e6+123 ; +const I MOD = 1e9+7 ; +const I inf = 2e9+7 ; +const L INF = 2e18+7 ; + +struct item{ + int cnt = 0, pref = 0, suff = 0, sum = 0 ; +} t[MaxN] ; +int m[MaxN] ; + +void push(int v, int x, int y) +{ + if (m[v] != -1 && v*2+1 < 4000004) + { + m[v*2] = m[v*2+1] = m[v] ; + m[v] = -1 ; + + int z = (x+y)/2 ; + t[v*2].sum = (z*1ll-x*1ll+1ll) * (m[v*2]*1ll) ; + t[v*2].pref = m[v*2] ; + t[v*2].cnt = m[v*2] ; + t[v*2].suff = m[v*2] ; + t[v*2+1].sum = (y*1ll-z*1ll) * (m[v*2+1]*1ll) ; + t[v*2+1].pref = m[v*2+1] ; + t[v*2+1].cnt = m[v*2+1] ; + t[v*2+1].suff = m[v*2+1] ; + } +} + +void update(int l, int r, int c, int v, int x, int y) +{ + if (l <= x && y <= r) { + t[v].sum = c*1ll * (y*1ll-x*1ll+1ll) ; + t[v].cnt = c ; + t[v].pref = c ; + t[v].suff = c ; + m[v] = c ; + return ; + } + + if (y < l || r < x) + return ; + + push(v, x, y) ; + int z = (x+y)/2 ; + update(l, r, c, v * 2, x, z) ; + update(l, r, c, v * 2 + 1, z+1, y) ; + t[v].pref = t[v*2].pref, + t[v].suff = t[v*2+1].suff, + t[v].sum = t[v*2].sum + t[v*2+1].sum, + t[v].cnt = t[v*2].cnt + t[v*2+1].cnt - (t[v*2].suff && t[v*2+1].pref?1:0); +} + +int main() +{ + freopen("painter.in", "r", stdin) ; + freopen("painter.out", "w", stdout) ; + for(int i = 0 ; i < MaxN ; ++i) + m[i] = -1 ; + int n ; + cin >> n ; + while(n--) + { + char c ; + int l, r ; + cin >> c >> l >> r ; + if(c == 'W') c = 0 ; + else c = 1 ; + update(l+500001, l+r-1+500001, int(c), 1, 1, 2000000); + cout << t[1].cnt << ' ' << t[1].sum << '\n' ; + } +} +/* +7 +W 2 3 +B 2 2 +B 4 2 +B 3 2 +B 7 2 +W 3 1 +W 0 10 +*/ \ No newline at end of file diff --git a/data-structures/rycarski_turnir356a.cpp b/data-structures/rycarski_turnir356a.cpp new file mode 100755 index 0000000..27a5720 --- /dev/null +++ b/data-structures/rycarski_turnir356a.cpp @@ -0,0 +1,59 @@ +#include + +using namespace std; + +int n , m , add[1200004],t[1200004],l[300003],r[300003],x[300003]; + +void push(int v , int tl ,int tr) +{ + if(add[v] != 0) + { + if(tl != tr) + add[v * 2] = add[v] , + add[v * 2 + 1] = add[v] ; + t[v] = add[v] ; + add[v] = 0 ; + } +} +void update(int v,int tl, int tr , int l,int r ,int x) +{ + push(v,tl,tr) ; + if(tl > r || tr < l || l > r){ + return ; + } + if(l <= tl && tr <= r) + { + add[v] = x ; + push(v,tl,tr) ; + return ; + } + int mid = (tl + tr) / 2 ; + update(v * 2 , tl , mid , l ,r , x); + update(v * 2 + 1, mid + 1, tr , l , r , x); +} +int get(int v , int tl ,int tr , int pos) +{ + push(v,tl,tr) ; + if(tl == tr) + return t[v ]; + else + { + int mid = (tl + tr) / 2 ; + if(pos <= mid) + get(v * 2, tl ,mid , pos) ; + else + get(v * 2 + 1, mid + 1, tr, pos) ; + } +} +int main() +{ + cin >> n >> m ; + for(int i = 1 ; i <= m ; i++) cin >> l[i] >> r[i] >> x[i] ; + for(int i = m ; i >= 1 ; i--) + { + update(1,1,n,x[i]+1,r[i],x[i]) ; + update(1,1,n,l[i],x[i]-1,x[i]) ; + } + for(int i = 1; i <= n ; i++) + cout << get(1,1,n,i) << ' ' ; +} diff --git a/data-structures/segtreecolminupdx.cpp b/data-structures/segtreecolminupdx.cpp new file mode 100644 index 0000000..9c5966b --- /dev/null +++ b/data-structures/segtreecolminupdx.cpp @@ -0,0 +1,123 @@ +/* +#pragma GCC target ("avx2") +#pragma GCC optimize ("Ofast") +#pragma GCC optimize ("unroll-loops") +*/ +#include "bits/stdc++.h" + +#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) +#define BIT(x) __builtin_popcount(x) +#define all(x) x.begin() , x.end() +#define F first +#define S second +#define pb push_back + +using namespace std ; + +typedef unsigned long long UL ; +typedef long long L ; +typedef string T ; +typedef int I ; + +const I MaxN = 1e5+1 ; +const I MOD = 1e9+7 ; +const I inf = 2e9+7 ; +const L INF = 2e18+7 ; + +L a[MaxN], n, m ; + +struct{ + L mn = INF, c = 0 ; +} t[MaxN*4] ; + +void build(int v, int tl, int tr) +{ + if(tl == tr) + { + t[v].mn = a[tl] ; + t[v].c = 1 ; + return ; + } + + int tm = (tl + tr) >> 1 ; + build(v*2, tl, tm) ; + build(v*2+1, tm+1, tr) ; + t[v].mn = min(t[v*2].mn, t[v*2+1].mn) ; + t[v].c = (t[v].mn==t[v*2].mn?t[v*2].c:0) + (t[v].mn==t[v*2+1].mn?t[v*2+1].c:0) ; +} + +void update(int v, int tl, int tr, int l, int x) +{ + if(tl == tr && tl == l) + { + t[v].mn = x ; + t[v].c = 1 ; + return ; + } + + if(tr < l || l < tl) + return ; + + int tm = (tl + tr) >> 1 ; + update(v*2, tl, tm, l, x) ; + update(v*2+1, tm+1, tr, l, x) ; + t[v].mn = min(t[v*2].mn, t[v*2+1].mn) ; + t[v].c = (t[v].mn==t[v*2].mn?t[v*2].c:0) + (t[v].mn==t[v*2+1].mn?t[v*2+1].c:0) ; +} + +L get(int v, int tl, int tr, int l, int r) +{ + if(l <= tl && tr <= r) + return t[v].mn ; + + if(l > tr || r < tl) + return INF ; + + int tm = (tl + tr) >> 1 ; + return min(get(v*2, tl, tm, l, r), get(v*2+1, tm+1, tr, l, r)) ; +} + +L col(int v, int tl, int tr, int l, int r, int mn) +{ + if(l <= tl && tr <= r) + return (t[v].mn == mn?t[v].c:0) ; + + if(l > tr || r < tl) + return 0 ; + + int tm = (tl + tr) >> 1 ; + L cl = 0 ; + cl += col(v*2, tl, tm, l, r, mn) ; + cl += col(v*2+1, tm+1, tr, l, r, mn) ; + return cl ; +} + +int32_t main(int argc, char *argv[]) +{ + if(argc > 1) + freopen(argv[1], "r", stdin) ; + //freopen(".in" , "r" , stdin) ; + //freopen(".out" , "w" , stdout) ; + cin >> n >> m ; + for(int i = 0 ; i < n ; ++i) + cin >> a[i] ; + + build(1, 0, n-1) ; + + while(m--) + { + int type, l, r, x ; + cin >> type ; + if(type == 1) + { + cin >> l >> x ; + update(1, 0, n-1, l, x) ; + } + else + { + cin >> l >> r ; + int mn = get(1, 0, n-1, l, r-1), cl = col(1, 0, n-1, l, r-1, mn) ; + cout << mn << ' ' << cl << '\n' ; + } + } +} \ No newline at end of file diff --git a/data-structures/segtreekth.cpp b/data-structures/segtreekth.cpp new file mode 100644 index 0000000..8db3f76 --- /dev/null +++ b/data-structures/segtreekth.cpp @@ -0,0 +1,99 @@ +/* +#pragma GCC target ("avx2") +#pragma GCC optimize ("Ofast") +#pragma GCC optimize ("unroll-loops") +*/ +#include "bits/stdc++.h" + +#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) +#define BIT(x) __builtin_popcount(x) +#define all(x) x.begin() , x.end() +#define F first +#define S second +#define pb push_back + +using namespace std ; + +typedef unsigned long long UL ; +typedef long long L ; +typedef string T ; +typedef int I ; + +const I MaxN = 1e5+1 ; +const I MOD = 1e9+7 ; +const I inf = 2e9+7 ; +const L INF = 2e18+7 ; + +int t[4*MaxN], a[MaxN], n, m ; + +void build(int v, int tl, int tr) +{ + if(tl == tr) + { + t[v] = a[tl] ; + return ; + } + + int tm = (tl + tr) >> 1 ; + build(v*2, tl, tm) ; + build(v*2+1, tm+1, tr) ; + t[v] = t[v*2] + t[v*2+1] ; +} + +void update(int v, int tl, int tr, int l) +{ + if(tl == tr && tl == l) + { + t[v] ^= 1; + return ; + } + + if(tr < l || l < tl) + return ; + + int tm = (tl + tr) >> 1 ; + update(v*2, tl, tm, l) ; + update(v*2+1, tm+1, tr, l) ; + t[v] = t[v*2] + t[v*2+1] ; +} + +int idx(int v, int tl, int tr, int k) +{ + if(tl == tr) + return tl ; + + int tm = (tl + tr) >> 1 ; + if(t[v*2] >= k) + return idx(v*2, tl, tm, k) ; + else + return idx(v*2+1, tm+1, tr, k-t[v*2]) ; +} + +int32_t main(int argc, char *argv[]) +{ + if(argc > 1) + freopen(argv[1], "r", stdin) ; + //freopen(".in" , "r" , stdin) ; + //freopen(".out" , "w" , stdout) ; + cin >> n >> m ; + for(int i = 0 ; i < n ; ++i) + cin >> a[i] ; + + build(1, 0, n-1) ; + + while(m--) + { + int type, l ; + cin >> type ; + if(type == 1) + { + cin >> l ; + update(1, 0, n-1, l) ; + } + else + { + cin >> l ; + cout << idx(1, 0, n-1, l+1) << '\n' ; + } + } +} \ No newline at end of file diff --git a/data-structures/segtreeminupdx.cpp b/data-structures/segtreeminupdx.cpp new file mode 100644 index 0000000..c61408e --- /dev/null +++ b/data-structures/segtreeminupdx.cpp @@ -0,0 +1,99 @@ +/* +#pragma GCC target ("avx2") +#pragma GCC optimize ("Ofast") +#pragma GCC optimize ("unroll-loops") +*/ +#include "bits/stdc++.h" + +#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) +#define BIT(x) __builtin_popcount(x) +#define all(x) x.begin() , x.end() +#define F first +#define S second +#define pb push_back + +using namespace std ; + +typedef unsigned long long UL ; +typedef long long L ; +typedef string T ; +typedef int I ; + +const I MaxN = 1e5+1 ; +const I MOD = 1e9+7 ; +const I inf = 2e9+7 ; +const L INF = 2e18+7 ; + +L t[4*MaxN], mod[4*MaxN], a[MaxN], n, m ; + +void build(int v, int tl, int tr) +{ + if(tl == tr) + { + t[v] = a[tl] ; + return ; + } + + int tm = (tl + tr) >> 1 ; + build(v*2, tl, tm) ; + build(v*2+1, tm+1, tr) ; + t[v] = min(t[v*2], t[v*2+1]) ; +} + +void update(int v, int tl, int tr, int l, int x) +{ + if(tl == tr && tl == l) + { + t[v] = x ; + return ; + } + + if(tr < l || l < tl) + return ; + + int tm = (tl + tr) >> 1 ; + update(v*2, tl, tm, l, x) ; + update(v*2+1, tm+1, tr, l, x) ; + t[v] = min(t[v*2], t[v*2+1]) ; +} + +L get(int v, int tl, int tr, int l, int r) +{ + if(l <= tl && tr <= r) + return t[v] ; + + if(l > tr || r < tl) + return INF ; + + int tm = (tl + tr) >> 1 ; + return min(get(v*2, tl, tm, l, r), get(v*2+1, tm+1, tr, l, r)) ; +} + +int32_t main(int argc, char *argv[]) +{ + if(argc > 1) + freopen(argv[1], "r", stdin) ; + //freopen(".in" , "r" , stdin) ; + //freopen(".out" , "w" , stdout) ; + cin >> n >> m ; + for(int i = 0 ; i < n ; ++i) + cin >> a[i] ; + + build(1, 0, n-1) ; + + while(m--) + { + int type, l, r, x ; + cin >> type ; + if(type == 1) + { + cin >> l >> x ; + update(1, 0, n-1, l, x) ; + } + else + { + cin >> l >> r ; + cout << get(1, 0, n-1, l, r-1) << '\n' ; + } + } +} \ No newline at end of file diff --git a/data-structures/segtreesufpref.cpp b/data-structures/segtreesufpref.cpp new file mode 100644 index 0000000..b763e91 --- /dev/null +++ b/data-structures/segtreesufpref.cpp @@ -0,0 +1,96 @@ +/* +#pragma GCC target ("avx2") +#pragma GCC optimize ("Ofast") +#pragma GCC optimize ("unroll-loops") +*/ +#include "bits/stdc++.h" + +#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) +#define BIT(x) __builtin_popcount(x) +#define all(x) x.begin() , x.end() +#define F first +#define S second +#define pb push_back + +using namespace std ; + +typedef unsigned long long UL ; +typedef long long L ; +typedef string T ; +typedef int I ; + +const I MaxN = 1e5+1 ; +const I MOD = 1e9+7 ; +const I inf = 2e9+7 ; +const L INF = 2e18+7 ; + +L a[MaxN], n, m ; + +struct{ + L pref = -INF, suff = -INF, sum = -INF, ans = -INF ; +} t[MaxN*4] ; + +void build(int v, int tl, int tr) +{ + if(tl == tr) + { + t[v].sum = a[tl] ; + t[v].ans = a[tl] ; + t[v].pref = a[tl] ; + t[v].suff = a[tl] ; + return ; + } + + int tm = (tl + tr) >> 1 ; + build(v*2, tl, tm) ; + build(v*2+1, tm+1, tr) ; + t[v].ans = max(max(t[v*2].ans, t[v*2+1].ans), t[v*2].suff + t[v*2+1].pref) ; + t[v].sum = t[v*2].sum + t[v*2+1].sum ; + t[v].pref = max(t[v*2].pref, t[v*2].sum + t[v*2+1].pref) ; + t[v].suff = max(t[v*2+1].suff, t[v*2].suff + t[v*2+1].sum) ; +} + +void update(int v, int tl, int tr, int l, int x) +{ + if(tl == tr && tl == l) + { + t[v].sum = x ; + t[v].ans = x ; + t[v].pref = x ; + t[v].suff = x ; + return ; + } + + if(tr < l || l < tl) + return ; + + int tm = (tl + tr) >> 1 ; + update(v*2, tl, tm, l, x) ; + update(v*2+1, tm+1, tr, l, x) ; + t[v].ans = max(max(t[v*2].ans, t[v*2+1].ans), t[v*2].suff + t[v*2+1].pref) ; + t[v].sum = t[v*2].sum + t[v*2+1].sum ; + t[v].pref = max(t[v*2].pref, t[v*2].sum + t[v*2+1].pref) ; + t[v].suff = max(t[v*2+1].suff, t[v*2].suff + t[v*2+1].sum) ; +} + +int32_t main(int argc, char *argv[]) +{ + if(argc > 1) + freopen(argv[1], "r", stdin) ; + //freopen(".in" , "r" , stdin) ; + //freopen(".out" , "w" , stdout) ; + cin >> n >> m ; + for(int i = 0 ; i < n ; ++i) + cin >> a[i] ; + + build(1, 0, n-1) ; + + cout << max(0ll, t[1].ans) << '\n' ; + while(m--) + { + int l, x ; + cin >> l >> x ; + update(1, 0, n-1, l, x) ; + cout << max(0ll, t[1].ans) << '\n' ; + } +} \ No newline at end of file diff --git a/data-structures/segtreesumupdlr.cpp b/data-structures/segtreesumupdlr.cpp new file mode 100644 index 0000000..f8fb8d3 --- /dev/null +++ b/data-structures/segtreesumupdlr.cpp @@ -0,0 +1,117 @@ +/* +#pragma GCC target ("avx2") +#pragma GCC optimize ("Ofast") +#pragma GCC optimize ("unroll-loops") +*/ +#include "bits/stdc++.h" + +#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) +#define BIT(x) __builtin_popcount(x) +#define all(x) x.begin() , x.end() +#define F first +#define S second +#define pb push_back + +using namespace std ; + +typedef unsigned long long UL ; +typedef long long L ; +typedef string T ; +typedef int I ; + +const I MaxN = 1e5+1 ; +const I MOD = 1e9+7 ; +const I inf = 2e9+7 ; +const L INF = 2e18+7 ; + +int t[4*MaxN], mod[4*MaxN], a[MaxN], n ; + +void build(int v, int tl, int tr) +{ + if(tl == tr) + { + t[v] = a[tl] ; + return ; + } + + int tm = (tl + tr) >> 1 ; + build(v*2, tl, tm) ; + build(v*2+1, tm+1, tr) ; + t[v] = t[v*2] + t[v*2+1] ; +} + +void push(int v, int tl, int tr) +{ + if(mod[v] != 0 && v*2+1 < 4*MaxN) + { + mod[v*2] = mod[v*2+1] = mod[v] ; + mod[v] = 0 ; + + int tm = (tl + tr) >> 1 ; + t[v*2] = (tm-tl+1) * mod[v*2] ; + t[v*2+1] = (tr-tm) * mod[v*2+1] ; + } +} + +void update(int v, int tl, int tr, int l, int r, int x) +{ + if(l <= tl && tr <= r) + { + t[v] = x * (tr-tl+1) ; + mod[v] = x ; + return ; + } + + if(tr < l || r < tl) + return ; + + push(v, tl, tr) ; + int tm = (tl + tr) >> 1 ; + update(v*2, tl, tm, l, r, x) ; + update(v*2+1, tm+1, tr, l, r, x) ; + t[v] = t[v*2] + t[v*2+1] ; +} + +int get(int v, int tl, int tr, int l, int r) +{ + if(l <= tl && tr <= r) + return t[v] ; + + if(l > tr || r < tl) + return 0 ; + + push(v, tl, tr) ; + int tm = (tl + tr) >> 1 ; + return get(v*2, tl, tm, l, r) + get(v*2+1, tm+1, tr, l, r) ; +} + +int32_t main(int argc, char *argv[]) +{ + if(argc > 1) + freopen(argv[1], "r", stdin) ; + //freopen(".in" , "r" , stdin) ; + //freopen(".out" , "w" , stdout) ; + cin >> n ; + for(int i = 1 ; i <= n ; ++i) + cin >> a[i] ; + + build(1, 1, n) ; + + int t ; + cin >> t ; + while(t--) + { + int type, l, r, x ; + cin >> type ; + if(type == 1) + { + cin >> l >> r >> x ; + update(1, 1, n, l, r, x) ; + } + else + { + cin >> l >> r ; + cout << get(1, 1, n, l, r) << '\n' ; + } + } +} \ No newline at end of file diff --git a/data-structures/segtreesumupdx.cpp b/data-structures/segtreesumupdx.cpp new file mode 100644 index 0000000..f01005d --- /dev/null +++ b/data-structures/segtreesumupdx.cpp @@ -0,0 +1,99 @@ +/* +#pragma GCC target ("avx2") +#pragma GCC optimize ("Ofast") +#pragma GCC optimize ("unroll-loops") +*/ +#include "bits/stdc++.h" + +#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) +#define BIT(x) __builtin_popcount(x) +#define all(x) x.begin() , x.end() +#define F first +#define S second +#define pb push_back + +using namespace std ; + +typedef unsigned long long UL ; +typedef long long L ; +typedef string T ; +typedef int I ; + +const I MaxN = 1e5+1 ; +const I MOD = 1e9+7 ; +const I inf = 2e9+7 ; +const L INF = 2e18+7 ; + +L t[4*MaxN], mod[4*MaxN], a[MaxN], n, m ; + +void build(int v, int tl, int tr) +{ + if(tl == tr) + { + t[v] = a[tl] ; + return ; + } + + int tm = (tl + tr) >> 1 ; + build(v*2, tl, tm) ; + build(v*2+1, tm+1, tr) ; + t[v] = t[v*2] + t[v*2+1] ; +} + +void update(int v, int tl, int tr, int l, int x) +{ + if(tl == tr && tl == l) + { + t[v] = x ; + return ; + } + + if(tr < l || l < tl) + return ; + + int tm = (tl + tr) >> 1 ; + update(v*2, tl, tm, l, x) ; + update(v*2+1, tm+1, tr, l, x) ; + t[v] = t[v*2] + t[v*2+1] ; +} + +L get(int v, int tl, int tr, int l, int r) +{ + if(l <= tl && tr <= r) + return t[v] ; + + if(l > tr || r < tl) + return 0 ; + + int tm = (tl + tr) >> 1 ; + return get(v*2, tl, tm, l, r) + get(v*2+1, tm+1, tr, l, r) ; +} + +int32_t main(int argc, char *argv[]) +{ + if(argc > 1) + freopen(argv[1], "r", stdin) ; + //freopen(".in" , "r" , stdin) ; + //freopen(".out" , "w" , stdout) ; + cin >> n >> m ; + for(int i = 0 ; i < n ; ++i) + cin >> a[i] ; + + build(1, 0, n-1) ; + + while(m--) + { + int type, l, r, x ; + cin >> type ; + if(type == 1) + { + cin >> l >> x ; + update(1, 0, n-1, l, x) ; + } + else + { + cin >> l >> r ; + cout << get(1, 0, n-1, l, r-1) << '\n' ; + } + } +} \ No newline at end of file diff --git a/data-structures/sparse-table.cpp b/data-structures/sparse-table.cpp new file mode 100755 index 0000000..cbc2327 --- /dev/null +++ b/data-structures/sparse-table.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#include + +#define pb push_back +#define ub upper_bound +#define lb lower_bound +#define sc(x) scanf("%I64d",&x) +#define pr(x) printf("%I64d\n",x) +#define int long long + +using namespace std ; + +const int MAXN = 1e9+1 ; +const int N = 1e6+1 ; +int n , m , k , x , y , z , gt ; +int a[N] , d[30][N] , p[N] ; + +void build () +{ + for (int i = 1 ; i <= n ; ++i ) + d[0][i] = a[i] ; + for (int i = 2 ; i < N ; ++i ) + p[i] = p[i / 2] + 1; + for (int i = 1 ; i <= p[n] ; ++i ) + for (int j = 1 ; j <= n - (1 << p[i]) + 1 ; ++j ) + d[i][j] = min (d[i - 1][j] , d[i - 1][j + (1 << (i - 1))]) ; +} + +int get (int l , int r) +{ + int rr = max(r,l) ; + int ll = min(r,l) ; + int m = rr-ll + 1 ; + m = p[m] ; + return min (d[m][ll] , d[m][rr - (1 << m) + 1]) ; +} + +main() +{ + cin >> n >> m >> a[1] ; + for ( int i = 2 ; i <= n ; ++i ) + { + a[i] = (23*a[i-1]+21563) % 16714589 ; + } + build() ; + int l , r ; + cin >> l >> r ; + for ( int i = 2 ; i <= m ; ++i ) + { + gt = get(l,r) ; + l = ((17*l+751+gt+2*(i-1))%n)+1 ; + r = ((13*r+593+gt+5*(i-1))%n)+1 ; + } + gt = get(l,r) ; + cout << l << ' ' << r << ' ' << gt ; +} diff --git a/graphs/bridges.cpp b/graphs/bridges.cpp new file mode 100755 index 0000000..6eef9ba --- /dev/null +++ b/graphs/bridges.cpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include +#include + +using namespace std ; + +map,int> mp ; + +int tin[20001] , fup[20001] , timer ; + +vector g[20001] , ans ; + +bool used[20001] ; + +void dfs(int v,int p = -1) +{ + used[v] = 1 ; + tin[v]=fup[v]=timer,timer++ ; + for(int i = 0 ; i < g[v].size() ; ++i) + { + int u = g[v][i] ; + if(u==p) + continue ; + if(used[u]) + fup[v]=min(fup[v],tin[u]) ; + else + { + dfs(u,v) ; + fup[v] = min(fup[v],fup[u]) ; + if(tin[v]pr ; + pr.first = v , pr.second = u ; + ans.push_back(mp[pr]) ; + } + } + } +} + +int main() +{ + int n , m ; + cin >> n >> m ; + for(int i = 0 ; i < m ; ++i) + { + pairpr ; + cin >> pr.first >> pr.second ; + mp[pr] = i+1 ; + pairpr1; + pr1.first = pr.second ; + pr1.second = pr.first ; + mp[pr1] = i+1 ; + g[pr.first].push_back(pr.second) ; + g[pr.second].push_back(pr.first) ; + } + for(int i = 0 ; i <= n ; ++i) + { + if(!used[i]) + dfs(i) ; + } + cout << ans.size() << '\n' ; + sort(ans.begin(),ans.end()) ; + for(int i = 0 ; i < ans.size() ; ++i) + { + cout << ans[i] << ' ' ; + } +} + diff --git a/graphs/cutpoints.cpp b/graphs/cutpoints.cpp new file mode 100755 index 0000000..4b4d4e8 --- /dev/null +++ b/graphs/cutpoints.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include + +using namespace std ; + +vector g[20001] ; set ans ; +bool used[20001] ; +int tin[20001] , fup[20001] , timer ; + +void dfs(int v, int p = -1) +{ + used[v] = 1 ; + tin[v]=fup[v]=timer ,++timer ; + int children = 0 ; + for(int i = 0 ; i < g[v].size() ; ++i) + { + int u = g[v][i] ; + if(u==p) + continue ; + if(used[u]) + fup[v]=min(fup[v],tin[u]) ; + else + { + dfs(u,v) ; + fup[v] = min(fup[v],fup[u]) ; + if(tin[v]<=fup[u]&&p!=-1) + { + ans.insert(v) ; + } + ++children ; + } + } + if(children>1&&p==-1) + { + ans.insert(v) ; + } +} + +int main() +{ + freopen("points.in","r",stdin) ; + freopen("points.out","w",stdout) ; + int n , m ; + cin >> n >> m ; + for(int i = 0 ; i < m ; ++i) + { + int l , r ; + cin >> l >> r ; + g[l].push_back(r) ; + g[r].push_back(l) ; + } + for(int i = 1 ; i <= n ; ++i) + if(!used[i]) dfs(i) ; + cout << ans.size() << '\n' ; + for (std::set::iterator i= ans.begin() ; i != ans.end() ; ++i) + { + cout << (*i) << ' ' ; + } +} diff --git a/graphs/dijkstra.cpp b/graphs/dijkstra.cpp new file mode 100755 index 0000000..2aaa375 --- /dev/null +++ b/graphs/dijkstra.cpp @@ -0,0 +1,56 @@ +#include + +using namespace std ; + +const long long MaxN = 1e6 + 17; +const long long INF = 1e14 + 17; + +long long n , m ; +vector > g[MaxN] ; +set > S ; +long long s , f ; +long long d[MaxN] ; + +int main () +{ + scanf ("%d%d", &n, &m); + s = 1 ; + for (int i = 1; i <= m; ++ i) { + int x, y, w; + scanf ("%d%d%d", &x, &y, &w); + g[x].push_back (make_pair (y, w)); + g[y].push_back (make_pair (x, w)); + } + for (int i = 1 ; i <= n ; ++i) + d[i] = INF ; + d[s] = 0 ; + vector p(n+1) ; + S.insert (make_pair (0,s)) ; + while (!S.empty()) { + int v = S.begin() -> second; + S.erase (*S.begin()); + for (int i = 0 ; i < g[v].size() ; ++ i) { + int to = g[v][i].first; + int w = g[v][i].second; + if (d[v] + w < d[to]) + { + S.erase(make_pair(d[to] , to)) ; + d[to] = d[v] + w ; + p[to] = v ; + S.insert(make_pair(d[to] , to)) ; + } + } + } + if(d[n] == INF) + return (cout << -1 , 0) ; + vector ans ; + for(int v = n ; v != 1 ; v = p[v]) + { + if(p[v] == 0) + return(cout << -1,0) ; + ans.push_back(v) ; + } + ans.push_back(1) ; + for(int i = ans.size() - 1 ; i >= 0 ; --i) + cout << ans[i] << ' ' ; +} diff --git a/graphs/lca.cpp b/graphs/lca.cpp new file mode 100755 index 0000000..76a17b3 --- /dev/null +++ b/graphs/lca.cpp @@ -0,0 +1,62 @@ +#include + +using namespace std ; + +vector g[500001] ; + +int n , m , lvl[500001] , used[500001] , k , up[500001][21] ; + +void dfs(int v , int p) +{ + used[v] = 1 ; + up[v][0] = p ; + for (int jump = 20 ; jump >= 1 ; --jump) + up[v][jump] = up[up[v][jump-1]][jump-1] ; + for (int i = 0 ; i < g[v].size() ; ++i) + { + int to = g[v][i] ; + if (!used[to]) + { + lvl[to] = lvl[v] + 1 ; + dfs(to, v) ; + } + } +} + +int lca(int a , int b) +{ + if (lvl[a] < lvl[b]) + swap(a,b) ; + for (int jump = 20 ; jump >= 0 ; --jump) + if (lvl[up[b][jump]] >= lvl[a]) + b = up[b][jump] ; + if (a == b) + return b ; + for (int jump = 20 ; jump >= 0 ; --jump) + if (up[a][jump] != up[b][jump]) + a = up[a][jump] , + b = up[b][jump] ; + return up[a][0] ; +} + +main() +{ + cin >> n ; + vector >z ; + for (int i = 0 ; i < n ; ++i) + { + string s ; + cin >> s ; + int a , b ; + cin >> a >> b; + if(s=="ADD") + g[a].push_back(b) ; + else + z.push_back(make_pair(a,b)) ; + } + lvl[1] = 1 ; + dfs(1, 1) ; + for (int i = 0 ; i < z.size() ; ++i) + cout << lca(z[i].first,z[i].second) << '\n' ; +} + diff --git a/graphs/maxflow.cpp b/graphs/maxflow.cpp new file mode 100755 index 0000000..b66e18a --- /dev/null +++ b/graphs/maxflow.cpp @@ -0,0 +1,71 @@ +#include +#define pb push_back +#define int long long +using namespace std ; +const long long MAXN = 1e9+1 ; +const int N = (int)(2e4) + 256 ; +int n , m , timer , used[N] , lim ; +struct edge{ + int v , u , c , f ; +}; +vector e ; +vector g[N] ; +inline void addEdge(int v , int u , int c ) +{ + e.pb({v,u,c,0}) ; + g[v].pb(e.size()-1) ; + e.pb({u,v,0,0}) ; + g[u].pb(e.size()-1) ; +} +int dfs ( int v , int t , int pushed = MAXN , int p = -1 ) +{ + if (used[v] == timer || pushed < lim) return 0; + if (!pushed || v == t) return pushed; + + used[v] = timer ; + for ( int i = 0 ; i < g[v].size() ; ++i ) + { + int id = g[v][i] ; + int to = e[id].u , f = e[id].f , c = e[id].c ; + if ( p == to || f == c ) continue ; + int nxt = dfs ( to , t , min ( pushed , c - f) , v); + if ( nxt > 0 ) + { + e[id].f += nxt ; + e[id^1].f -= nxt ; + return nxt ; + } + } + return 0 ; +} +inline int fordf(int s,int t) +{ + int res = 0 ; + lim = 1 << 30 ; + while ( lim > 0 ) + { + ++timer ; + int pushed = dfs(s,t) ; + if ( !pushed ) + { + lim >>= 1 ; + continue ; + } + res += pushed ; + } + return res ; +} +main() +{ + freopen("flow.in","r",stdin) ; + freopen("flow.out","w",stdout) ; + cin >> n >> m ; + for ( int i = 0 ; i < m ; ++i ) + { + int x , y , c ; + cin >> x >> y >> c ; + addEdge(x,y,c) ; + } + cout << fordf(1,n) << endl ; + return 0 ; +} diff --git a/graphs/unionday.cpp b/graphs/unionday.cpp new file mode 100644 index 0000000..a1ed79e --- /dev/null +++ b/graphs/unionday.cpp @@ -0,0 +1,73 @@ +/* +#pragma GCC target ("avx2") +#pragma GCC optimize ("Ofast") +#pragma GCC optimize ("unroll-loops") +*/ +#include "bits/stdc++.h" + +#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) +#define BIT(x) __builtin_popcount(x) +#define all(x) x.begin() , x.end() +#define F first +#define S second +#define pb push_back + +using namespace std ; + +typedef unsigned long long UL ; +typedef long long L ; +typedef string T ; +typedef int I ; + +const I MaxN = 1e5+1 ; +const I MOD = 1e9+7 ; +const float INF = 1e9+7 ; + +pair a[5001] ; +int p[5001] ; +float g[5001][5001], cost ; + +int32_t main() +{ + freopen("unionday.in" , "r" , stdin) ; + freopen("unionday.out" , "w" , stdout) ; + int n ; + cin >> n ; + for(int i = 0 ; i < n ; ++i) + { + cin >> a[i].F >> a[i].S ; + for(int j = 0 ; j < i ; ++j) + { + float d = (a[i].F-a[j].F)*(a[i].F-a[j].F)+(a[i].S-a[j].S)*(a[i].S-a[j].S) ; + d = sqrt(d) ; + g[i][j] = d ; + g[j][i] = d ; + } + } + vector used (n); + vector min_e (n, INF); + vector sel_e (n, -1); + min_e[0] = 0; + for (int i=0; i> s >> c ; + + + + int cnt = 0 ; + for(int i = 0 ; i < s.size() ; ++i) + if(s[i] == '1') + cnt ++ ; + + for(L i = 1, j = cnt-1; i <= s.size() ; i++) + { + ans[i] = c ; + for(L j = 1 ; j < i ; ++j) + { + ans[i]+=binpow(c, j)*pascal[i][j+1]; + ans[i]%=MOD; + } + if(s[s.size()-i] == '1') + anss+=ans[i]*binpow(c, j--), anss %= MOD ; + } + + cout << anss+1 ; +} \ No newline at end of file diff --git a/math/meet-in-the-middle.cpp b/math/meet-in-the-middle.cpp new file mode 100755 index 0000000..560c729 --- /dev/null +++ b/math/meet-in-the-middle.cpp @@ -0,0 +1,59 @@ +#include + +using namespace std; + +typedef long long ll; +const int maxn = (int) 3e5 + 1; + +int n, k; +ll ans; +int a[maxn], p, u[maxn]; +int main(){ + cin >> n >> k; + for(int i = 0; i < n; i++){ + cin >> a[i]; + } + p = n / 2; + for(int i = 0; i < (1 << p); i++){ + ll res = 0; + for(int j = 0; j < p; j++){ + if((i >> j) & 1){ + res += a[j]; + } + } + u[i] = res % k; + ans = max(ans, res % k); + } + sort(u, u + (1 << p)); + n -= p; + for(int i = 0; i < (1 << n); i++){ + ll res = 0; + for(int j = 0; j < n; j++){ + if((i >> j) & 1){ + res += a[j + p]; + } + } + res %= k; + ans = max(ans, res); + int l = 0, r = (1 << p) - 1; + while(r - l > 1){ + int mid = (l + r) / 2; + if(u[mid] + res >= k){ + r = mid; + } + else { + l = mid; + } + } + int p1 = 0; + if(u[l] + res >= k){ + p1 = l; + } + else { + p1 = r; + } + ans = max(ans, (u[(1 << p) - 1] + res) % k); + ans = max(ans, (u[p1 - 1] + res) % k); + } + cout << ans; +} diff --git a/math/pascaltriangle.cpp b/math/pascaltriangle.cpp new file mode 100755 index 0000000..d82ff0c --- /dev/null +++ b/math/pascaltriangle.cpp @@ -0,0 +1,20 @@ +#include + +using namespace std ; + +long long c[200][20000] ; + +main() +{ + freopen("combination.in","r",stdin) ; + freopen("combination.out","w",stdout) ; + int n , k ; + cin >> n >> k; + for(int i = 0 ; i <= n ; ++i) + { + c[i][0] = 1 ; c[i][i] = 1 ; + for(int j = 1 ; j < i ; ++j) + c[i][j] = c[i-1][j-1]+c[i-1][j] ; + } + cout << c[n][k] ; +} diff --git a/math/two-turtles.cpp b/math/two-turtles.cpp new file mode 100644 index 0000000..962fd66 --- /dev/null +++ b/math/two-turtles.cpp @@ -0,0 +1,118 @@ +#pragma GCC target ("avx2") +#pragma GCC optimize ("Ofast") +#pragma GCC optimize ("unroll-loops") +#include "bits/stdc++.h" + +#define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) +#define BIT(x) __builtin_popcount(x) +#define all(x) x.begin() , x.end() +#define F first +#define S second +#define pb push_back + +using namespace std ; + +typedef unsigned long long UL ; +typedef long long L ; +typedef string T ; +typedef int I ; + +const I MaxN = 1e5+1 ; +const I MOD = 1e9+7 ; +const I inf = 2e9+7 ; +const L INF = 2e18+7 ; + +char c[3001][3001] ; +L dp[3001][3001], pd[3001][3001] ; +bool ok[3001][3001], ok2[3001][3001] ; + +int32_t main() +{ + iosb ; + int n, m ; + cin >> n >> m ; + for(int i = 1 ; i <= n ; ++i) + for(int j = 1 ; j <= m ; ++j) + cin >> c[i][j] ; + + dp[2][1] = 1, pd[1][2] = 1 ; + if(c[2][1]!='#') + ok[2][1] = 1, ok2[2][1] = 1 ; + if(c[1][2]!='#') + ok[1][2] = 1, ok2[1][2] = 1 ; + for(int i = 2 ; i <= n ; ++i) + for(int j = 1 ; j <= m ; ++j) + { + if(i==2&&j==1) + continue ; + if(i==2) + { + if(c[i][j] == '#') + ok[i][j] = 0 ; + else if(!ok[i][j-1]) + ok[i][j] = 0 ; + else + dp[i][j] = dp[i][j-1], dp[i][j]%=MOD, ok[i][j] = 1 ; + continue ; + } + if(j==1) + { + if(c[i][j] == '#') + ok[i][j] = 0 ; + else if(!ok[i-1][j]) + ok[i][j] = 0 ; + else + dp[i][j] = dp[i-1][j], dp[i][j]%=MOD, ok[i][j] = 1 ; + continue ; + } + if(c[i][j] == '#') + ok[i][j] = 0 ; + else if(!ok[i][j-1] && !ok[i-1][j]) + ok[i][j] = 0 ; + else + dp[i][j] = dp[i][j-1] + dp[i-1][j], dp[i][j]%=MOD, ok[i][j] = 1 ; + } + + for(int i = 1 ; i <= n ; ++i) + for(int j = 2 ; j <= m ; ++j) + { + if(i==1&&j==2) + continue ; + if(i==1) + { + if(c[i][j] == '#') + ok2[i][j] = 0 ; + else if(!ok2[i][j-1]) + ok2[i][j] = 0 ; + else + pd[i][j] = pd[i][j-1], pd[i][j]%=MOD, ok2[i][j] = 1 ; + continue ; + } + if(j==2) + { + if(c[i][j] == '#') + ok2[i][j] = 0 ; + else if(!ok2[i-1][j]) + ok2[i][j] = 0 ; + else + pd[i][j] = pd[i-1][j], pd[i][j]%=MOD, ok2[i][j] = 1 ; + continue ; + } + if(c[i][j] == '#') + ok2[i][j] = 0 ; + else if(!ok2[i][j-1] && !ok2[i-1][j]) + ok2[i][j] = 0 ; + else + pd[i][j] = pd[i][j-1] + pd[i-1][j], pd[i][j]%=MOD, ok2[i][j] = 1 ; + } + + if(ok[n][m-1] && ok2[n-1][m]) + { + L ans = (((dp[n][m-1]*pd[n-1][m])%MOD)-((dp[n-1][m]*pd[n][m-1])%MOD)) ; + if(ans<0) + ans = MOD+ans ; + cout << ans << '\n' ; + } + else + cout << 0 << '\n' ; +} \ No newline at end of file diff --git a/other/ioi-ideas.pdf b/other/ioi-ideas.pdf new file mode 100755 index 0000000000000000000000000000000000000000..500a1a7606b1bfd903a1d86c21a966480acf1fcd GIT binary patch literal 26400 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 u`2a)vo67+H!$;2#UjJ$H_^#UcG*SR*