diff --git a/CSES/Tree Algorithms/Company Queries I.cpp b/CSES/Tree Algorithms/Company Queries I.cpp new file mode 100644 index 0000000..c8b3c7b --- /dev/null +++ b/CSES/Tree Algorithms/Company Queries I.cpp @@ -0,0 +1,78 @@ +/* + * Problem Name : Company Queries I + * Problem Link : https://cses.fi/problemset/task/1687/ + * Video solution link : https://youtu.be/H8h8XazNOV4 + * Write here if video solution doesn't exist : icodencode@gmail.com + * Channel name & link : CodeNCode (https://www.youtube.com/@codencode) + */ + +#include +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define INF 1000000000 +#define endl '\n' +const double PI = 3.141592653589793238460; +typedef std::complex Complex; +typedef std::valarray CArray; +using namespace std; + +const int maxN = 21; +vi ar[200001]; +int dp[200001][maxN]; +int n; + +void preprocess() +{ + for(int i=1;i 0) node = -1; + return node; +} + +int main() +{ + int q , a , k; + cin>>n>>q; + + memset(dp , -1 , sizeof dp); + for(int i=2;i<=n;i++) cin>>a , dp[i][0] = a; + + preprocess(); + + while(q--) + { + cin>>a>>k; + + cout< +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define INF 1000000000 +#define endl '\n' +const double PI = 3.141592653589793238460; +typedef std::complex Complex; +typedef std::valarray CArray; +using namespace std; + +int c[200002]; +int res[200001]; +vi ar[200002]; +set *st[200001]; + +void dfs(int node, int par) +{ + int mx = 0; + int mxNode = -1; + + for(int child : ar[node]) + if(child != par) + { + dfs(child , node); + if( st[child]->size() > mx ) + mx = st[child]->size() , mxNode = child; + } + + if(mxNode == -1) st[node] = new set(); + else st[node] = st[mxNode]; + + st[node] -> insert(c[node]); + + for(int child : ar[node]) + if(child != par && child != mxNode) + { + for(int color : *st[child]) + st[node]->insert(color); + } + + res[node] = st[node] -> size(); +} + +int main() +{ + int n , a , b; + cin>>n; + REP(i , n) cin>>c[i]; + + REP(i , n-1) cin>>a>>b , ar[a].pb(b) , ar[b].pb(a); + + dfs(1 , -1); + + REP(i , n) cout< +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define INF 1000000000 +#define endl '\n' +const double PI = 3.141592653589793238460; +typedef std::complex Complex; +typedef std::valarray CArray; +using namespace std; + +int sub[200001]; +int n; +vi ar[200001]; + +void subSize(int node ,int par) +{ + sub[node] = 1; + + for(int child : ar[node]) + if(child != par) + { + subSize(child , node); + sub[node] += sub[child]; + } +} + +int centroid(int node , int par) +{ + for(int child : ar[node]) + if(child != par && sub[child] > n/2) return centroid(child , node); + + return node; +} + +int main() +{ + int a , b; + cin>>n; + + REP(i , n-1) cin>>a>>b , ar[a].pb(b) , ar[b].pb(a); + + subSize(1 , -1); + cout< +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define INF 1000000000 +#define endl '\n' +const double PI = 3.141592653589793238460; +typedef std::complex Complex; +typedef std::valarray CArray; +using namespace std; + +const int N = 200001; +vi tree[N]; + +lli ar[N]; +lli temp[N]; + +lli st[2*N]; + +lli sub[N]; +lli in[N]; +int _timer = 0; + +void dfs(int node, int par) +{ + sub[node] = 1; + in[node] = ++_timer; + ar[in[node]] = temp[node]; + + for(int child : tree[node]) + if(child != par) + dfs(child , node) , sub[node] += sub[child]; +} + +void build(int si , int ss , int se) +{ + + if(ss == se){ + st[si] = ar[ss]; + return; + } + + int mid = (ss + se) >> 1; + build(2*si , ss , mid); + build(2*si + 1 , mid+1 , se); + + st[si] = st[2*si] + st[2*si + 1]; +} + +void update(int si , int ss , int se , int qi , lli dx) +{ + if(ss > qi || se < qi) return; + + if(ss == se) + { + st[si] += dx; + return; + } + + int mid = (ss + se) >> 1; + update(2*si , ss , mid , qi , dx); + update(2*si + 1 , mid+1 , se , qi , dx); + + st[si] = st[2*si] + st[2*si + 1]; +} + +lli getSum(int si , int ss , int se , int qs , int qe) +{ + if(ss > qe || se < qs) return 0; + + if(ss >= qs && se <= qe) + return st[si]; + + int mid = (ss + se) >> 1; + lli L = getSum(2*si , ss , mid , qs , qe); + lli R = getSum(2*si + 1 , mid+1 , se , qs , qe); + + return L + R; +} + +int main() +{ + int n , q , a , b , code; + cin>>n>>q; + + REP(i , n) cin>>temp[i]; + REP(i , n-1) cin>>a>>b , tree[a].pb(b) , tree[b].pb(a); + + dfs(1 , -1); + build(1 , 1 , n); + + while(q--) + { + cin>>code; + + if(code == 1) { + cin>>a>>b; + update(1 , 1 , n , in[a] , b - ar[in[a]]); + ar[in[a]] = b; + } + else{ + cin>>a; + cout< +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define INF 1000000000 +#define endl '\n' +const double PI = 3.141592653589793238460; +typedef std::complex Complex; +typedef std::valarray CArray; +using namespace std; + +vi ar[200001]; +int f[200001]; +int g[200001]; +int d; + +void dfs(int node ,int par) +{ + vi childList; + + for(int child : ar[node]) + if(child != par) + { + dfs(child , node); + f[node] = max(f[node] , f[child] + 1); + childList.pb(f[child]); + } + + d = max(d , f[node]); + + sort(childList.begin() , childList.end()); + if(childList.size() >= 2) + { + g[node] = 2 + childList[childList.size()-1] + childList[childList.size()-2]; + d = max(d , g[node]); + } +} + +int main() +{ + int n , a , b; + cin>>n; + REP(i , n-1) cin>>a>>b , ar[a].pb(b) , ar[b].pb(a); + + dfs(1 , -1); + + cout< +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define INF 1000000000 +#define endl '\n' +const double PI = 3.141592653589793238460; +typedef std::complex Complex; +typedef std::valarray CArray; +using namespace std; + +vi ar[200001]; +lli res[200001]; +int subSize[200001]; +lli subDist[200001]; +int n; + +void dfs1(int node , int par) +{ + subSize[node] = 1; + + for(int child : ar[node]) + if(child != par) + { + dfs1(child , node); + subSize[node] += subSize[child]; + + subDist[node] += subSize[child] + subDist[child]; + } +} + +void dfs(int node , int par) +{ + res[node] = res[par] - subSize[node] - subDist[node] + n - subSize[node] + subDist[node]; + + for(int child : ar[node]) + if(child != par) + dfs(child , node); +} + +int main() +{ + int a , b; + cin>>n; + REP(i , n-1) cin>>a>>b , ar[a].pb(b) , ar[b].pb(a); + + dfs1(1 , -1); + res[1] = subDist[1]; + + for(int child : ar[1]) + dfs(child , 1); + + REP(i , n) cout< +#include +#include + +using namespace std; + +// Extracts floor number from classroom number +int get_floor(int classroom) { + return classroom / 100; +} + +bool comp(int a, int b) { + return get_floor(a) < get_floor(b); +} +int main() { + int t; + cin >> t; + + while (t--) { + int n, m; + cin >> n >> m; + + vector classrooms(m); + for (int i = 0; i < m; ++i) + cin >> classrooms[i]; + + sort(classrooms.begin(), classrooms.end(), comp); + + vector> schedule(n, vector(6)); + int left = 0, right = m-1; + + for (int i = 1; i < n; i+=2) { + schedule[i ][0] = classrooms[left++]; + schedule[i-1][0] = classrooms[right--]; + } + + for(int k=1; k<6; k++) { + for(int i=1; i +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define endl '\n' +using namespace std; +int ar[200001]; + +int getMax1(int n) +{ + int cnt = 1; + for(int i=n-1;i>=1;i--) + if(ar[i] <= ar[i+1]) + cnt++; + else + break; + + return cnt; +} + +int getMax2(int n) +{ + int cnt = 1; + for(int i=n-1;i>=1;i--) + if(ar[i] >= ar[i+1]) cnt++; + else + break; + + return cnt; +} + +int getMax3(int n) +{ + int cnt = 1; + + int i = n-1; + for(;i>=1;i--) + { + if(ar[i] >= ar[i+1]) cnt++; + else + break; + } + + for(;i>=1;i--) + { + if(ar[i] <= ar[i+1]) cnt++; + else + break; + } + + return cnt; +} + +int main() +{ + int t , n , mx; + cin>>t; + while(t--) + { + cin>>n; + REP(i , n) cin>>ar[i]; + + mx = 1; + mx = max(mx , getMax1(n)); + mx = max(mx , getMax2(n)); + mx = max(mx , getMax3(n)); + + + cout< +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define endl '\n' +using namespace std; +char ar[1000001]; +int n; + +int getAns() +{ + stack st; + + REP(i , n) + { + if(ar[i] == '(') + st.push('('); + else + { + if(!st.empty() && st.top() == '(') st.pop(); + else + st.push(')'); + } + } + + return st.size(); +} + +int main() +{ + int t; + cin>>t; + + while(t--) + { + cin>>n; + REP(i , n) cin>>ar[i]; + + cout<<(getAns())/2< +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define endl '\n' +using namespace std; +int ar[1000001]; +map mp; + +int getCnt(int key) +{ + return mp[key]; +} + +int main() +{ + lli t , res; + string st; + cin>>t; + while(t--) + { + cin>>st; + mp.clear(); + + res = 0; + int mx = 0; + int cnt = 0; + for(int i=0;i +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define INF 1000000000 +#define endl '\n' +const double PI = 3.141592653589793238460; +typedef std::complex Complex; +typedef std::valarray CArray; + +using namespace std; +lli ar[200001] , br[200001]; +int main() +{ + int t , n , k; + cin>>t; + while(t--) + { + cin>>n>>k; + REP(i , n) cin>>ar[i]; + REP(i , k) cin>>br[i]; + + sort(ar+1 , ar+n+1); + sort(br+1 , br+k+1); + + lli res = 0; + int i = 1; + int j = n; + int p = 1; + + while(p <= k && br[p] == 1) + res += 2 * ar[j] , j-- , p++; + + for(int q=k;q>=p;q--) + { + res += ar[j] + ar[i]; + j-- , i++ , br[q] -= 2; + + while(br[q] > 0) + i++ , br[q]--; + } + + cout< +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define INF 1000000000 +#define endl '\n' +#define BLOCK 555 +const double PI = 3.141592653589793238460; +typedef std::complex Complex; +typedef std::valarray CArray; + +using namespace std; +struct query{ + int l; + int r; + int i; +}; +query Q[300001]; +int ar[300001] , ans[300001]; +int fre[300001]; + +int freOfFre[300001]; +int currMax = 0; + +bool comp(query a , query b) +{ + if(a.l / BLOCK != b.l/BLOCK) + return a.l/BLOCK < b.l/BLOCK; + + return a.r < b.r; +} + +void add(int pos) +{ + int preF = fre[ar[pos]]; + fre[ar[pos]]++; + int currF = fre[ar[pos]]; + + freOfFre[preF]--; + freOfFre[currF]++; + + if(currF > currMax) + { + currMax = currF; + } +} + +void remove(int pos) +{ + int preF = fre[ar[pos]]; + fre[ar[pos]]--; + int currF = fre[ar[pos]]; + + freOfFre[preF]--; + freOfFre[currF]++; + + if(currF < currMax) + { + while(freOfFre[currMax] == 0) + currMax--; + } +} + +int main() +{ + + ios_base::sync_with_stdio(false); + cin.tie(0); + cout.tie(0); + + int n , q; + cin>>n>>q; + for(int i=0;i>ar[i]; + + for(int i=0;i>Q[i].l>>Q[i].r; + Q[i].i = i , Q[i].l-- , Q[i].r--; + } + + sort(Q , Q+q , comp); + int ML = 0 , MR = -1; + for(int i=0;i L) + ML-- , add(ML); + + while(MR < R) + MR++ , add(MR); + + while(ML < L) + remove(ML) , ML++; + + while(MR > R) + remove(MR) , MR--; + + int total = Q[i].r - Q[i].l + 1; + int rem = total - currMax; + int half = (total+1)/2; + + if(currMax <= half) + ans[Q[i].i] = 1; + else + { + ans[Q[i].i] = total - 2*rem; + } + } + + for(int i=0;i -- [L01 : Orientation of 3 points | Geometric Algorithm | CodeNCode](https://www.youtube.com/watch?v=IwKkiaoqwTc) -- [E007 : Counting Bits using DP | Bit Manipulation | CodeNCode](https://www.youtube.com/watch?v=oidrF6nx01s) -- [E006 : The Sports Festival | Dynamic Programming | CodeNCode](https://www.youtube.com/watch?v=_AcGinQvK44) -- [E006 : Binary Literacy | Constructive Algorithms | CodeNCode](https://www.youtube.com/watch?v=1JEpe7wl1u4) -- [E002 : ADA and pet | String Algorithms | SPOJ](https://www.youtube.com/watch?v=oj5EWo7PL9M) +- [L13: Observer Pattern | Design Patterns](https://www.youtube.com/watch?v=N7qNtyHTh5c) +- [5 Most Important Topics you must cover for SDE1 Amazon Interview #programming #coding](https://www.youtube.com/shorts/x6IKa96a09w) +- [L12: Flyweight Pattern | Design Patterns](https://www.youtube.com/watch?v=x-VGZUwfev0) +- [Java design pattern course update #coding #programming #java #designpatternsinjava #designpatterns](https://www.youtube.com/shorts/P6HOll3evSM) +- [L11 : Composite Pattern | Design Patterns](https://www.youtube.com/watch?v=MPePQaMPlBs) ## List of Courses by CodeNCode -- [Basic Algorithms](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik5HC7D3gUwc8cqwDtvOaqke) +- [Basic Algorithms](https://www.youtube.com/playlist?list=PL5DyztRVgtRW09egS6AY2oTVwF_5MfdRj) - [Bit Manipulation](https://www.youtube.com/playlist?list=PL5DyztRVgtRUVORP3AXvX91uovcaZv0q9) -- [Combinatorics](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik48tGHU2eJxQdnGls2QPCBl) +- [Combinatorics](https://www.youtube.com/playlist?list=PL5DyztRVgtRXRA-AEcBI4kfs42Aq9P1kr) - [Disjoint Set Union](https://www.youtube.com/playlist?list=PL5DyztRVgtRVIAoYAKanON01SM7tVr8PE) - [Dynamic Programming Part 1](https://www.youtube.com/playlist?list=PL5DyztRVgtRVr1katnCAdGdp02nJrDHv6) - [Dynamic Programming Part 2](https://www.youtube.com/playlist?list=PL5DyztRVgtRV-t64WnLKpuDjDbH7xNmnW) - [Graph Theory Part 1](https://www.youtube.com/playlist?list=PL5DyztRVgtRVLwNWS7Rpp4qzVVHJalt22) - [Graph Theory Part 2](https://www.youtube.com/playlist?list=PL5DyztRVgtRW0Kdd8i1xML7t-ge56XRQR) - [Number Theory](https://www.youtube.com/playlist?list=PL5DyztRVgtRWblnyEHtajWijQffrfwLz6) -- [Queries On Trees](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik4mjMTt7Po4DocBBI_Ai6s8) +- [Queries On Trees](https://www.youtube.com/playlist?list=PL5DyztRVgtRVQsDZIJKYLYOj9uX9yluNJ) - [Recursion](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik7Vp1iJw2V57MT4UVdZDoWj) -- [Segment Tree](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik6v2-emg_JGcC9v2v2YTbvq) +- [Segment Tree](https://www.youtube.com/playlist?list=PL5DyztRVgtRWt0Kgy7fCN9OSPgr6AI3DO) - [String Algorithms](https://www.youtube.com/playlist?list=PL5DyztRVgtRWVqLox_K8lrWZCclxzHzLD) -- [Mo's Algorithm & SQRT Decomposition](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik6DCzm9XZJbNwyHtHGclcEh) -- [Geometric Algorithms](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik7OAGWIMYrgRkKqshRBpJoY) +- [Mo's Algorithm & SQRT Decomposition](https://www.youtube.com/playlist?list=PL5DyztRVgtRWtz6J5culNvZzeX5nnoZ7r) +- [Geometric Algorithms](https://www.youtube.com/playlist?list=PL5DyztRVgtRVHE6fulR_q0W_pNd8JdMlb) # Video Editorials : By Platform @@ -84,14 +84,14 @@ I have courses like Number theory and graph theory course which start from basic - [Binary Search](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik6LzOqo8V3GwthSd9GIN_CK) ## SPOJ -- [Number Theory](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik50mPNfoadAHoCnjeW2Jsw0) -- [Graph & Tree](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik5niWOljO7dQVn0o-zf_f9_) -- [Binary Search](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik609P408nEkgYjgE12gFcyx) -- [Segment Tree](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik5ihRT6oH2ztAYMnGBQ4gSa) -- [String Algorithms](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik5xR-rGBIiP-1V2uK0GZpTT) +- [Number Theory](https://www.youtube.com/playlist?list=PL5DyztRVgtRUeSPcvsTxVAdr7Jrp3S2oq) +- [Graph & Tree](https://www.youtube.com/playlist?list=PL5DyztRVgtRXNt92h6JfzKKf7EweRNWyf) +- [Binary Search](https://www.youtube.com/playlist?list=PL5DyztRVgtRWA58PlawGcA9-FVcdnJe3N) +- [Range Queries](https://www.youtube.com/playlist?list=PL5DyztRVgtRXQh9YUYhIbBvg-UrGJFAry) +- [String Algorithms](https://www.youtube.com/playlist?list=PL5DyztRVgtRWOFCsK0khl_oXdOHkSgGoc) - [Others](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik5rJQUqzgHdlmK7MSR4n8AK) ## Hackerrank -- [Bit Manipulation](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik4hYJ1dykHIJ68GR_Of8WiK) +- [Bit Manipulation](https://www.youtube.com/playlist?list=PL5DyztRVgtRVOMi_HXpUXOje3rPbUdmez) - [Number Theory](https://www.youtube.com/playlist?list=PL2q4fbVm1Ik7HIi2yVU1eIZN-mNDyBYMv) diff --git a/SPOJ/Binary Search/ABCDEF.cpp b/SPOJ/Binary Search/ABCDEF.cpp new file mode 100644 index 0000000..2fbf7ac --- /dev/null +++ b/SPOJ/Binary Search/ABCDEF.cpp @@ -0,0 +1,59 @@ +/* + * Problem Name : ABCDEF + * Problem Link : https://www.spoj.com/problems/ABCDEF/ + * Video solution link : https://youtu.be/07rX0DjWSdY + * Write here if video solution doesn't exist : icodencode@gmail.com + * Channel name & link : CodeNCode (https://www.youtube.com/@codencode) + */ + +#include +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define INF 1000000000 +#define endl '\n' +const double PI = 3.141592653589793238460; +typedef std::complex Complex; +typedef std::valarray CArray; +using namespace std; + +int ar[100]; +int main() +{ + int n; + map mp; + cin>>n; + + for(int i=0;i>ar[i]; + + for(int f=0;f +#define REP(i,n) for (int i = 1; i <= n; i++) +#define mod 1000000007 +#define pb push_back +#define ff first +#define ss second +#define ii pair +#define vi vector +#define vii vector +#define lli long long int +#define INF 1000000000 +#define endl '\n' +const double PI = 3.141592653589793238460; +typedef std::complex Complex; +typedef std::valarray CArray; + +using namespace std; +int ar[100001]; + +bool isValid(int mid , int C , int n) +{ + int cnt = 0; + int pre = -INF; + + for(int i=1;i<=n;i++) + if(ar[i] - pre >= mid) + cnt++ , pre = ar[i]; + + if(cnt >= C) return true; + else return false; +} + +int getAns(int n , int c) +{ + int L = 0; + int H = ar[n] - ar[1]; + + int ans = 0; + + while(L <= H) + { + int mid = (L + H) / 2; + + if(isValid(mid , c , n)) + ans = max(ans , mid) , L = mid + 1; + else + H = mid - 1; + } + + return ans; +} + +int main() +{ + int t , n , c; + cin>>t; + while(t--) + { + cin>>n>>c; + for(int i=1;i<=n;i++) + cin>>ar[i]; + + sort(ar + 1 , ar + n + 1); + cout< +using namespace std; + +const int N = 1e4; +vector adj[N+1]; +bool vis[N+1]; +bool isArticulationPoint[N+1]; +int in[N+1] , low[N+1]; +int timer; +int result; + +void clear(int n){ + for(int i=1;i<=n;i++){ + adj[i].clear(); + vis[i] = isArticulationPoint[i] = false; + } + timer = result = 0; +} + +void dfs(int node , int par){ + vis[node] = true; + in[node] = low[node] = timer++; + int child = 0; + + for(int v : adj[node]){ + if(v == par) continue; + + if(vis[v]){ + low[node] = min(low[node] , in[v]); + }else{ + child++ , dfs(v , node); + if(par != -1 && low[v] >= in[node]){ + if(isArticulationPoint[node] == false){ + isArticulationPoint[node] = true; + result++; + } + } + low[node] = min(low[node] , low[v]); + } + } + + if(par == -1 && child > 1){ + if(isArticulationPoint[node] == false){ + isArticulationPoint[node] = true; + result++; + } + } + +} + +int main(){ + #ifndef ONLINE_JUDGE + freopen("input.txt" , "r" , stdin); + freopen("output.txt" , "w" , stdout); + #endif + + int n , m; + int a , b; + + while(1){ + cin>>n>>m; + if(n == 0 && m == 0) break; + + clear(n); + + for(int i=1;i<=m;i++){ + cin>>a>>b; + adj[a].push_back(b); + adj[b].push_back(a); + } + + dfs(1 , -1); + cout< +#define vi vector +#define ll long long +#define mod 1000000007 +using namespace std; + +// complex # = a + ib +using cd = complex; +const double PI = acos(-1); + +vector fft(vector p, int n) { + if(n == 1) return p; + + vector Pe, Po; + + for(int i=0; 2*i inversefft(vector p, int n) { + if(n == 1) return p; + + vector Pe, Po; + + for(int i=0; 2*i multiply(vector &a, vector &b) { + vector fa(a.begin(), a.end()), fb(b.begin(), b.end()); + + // finding nearest power of 2. + int n = 1; + while(n < a.size() + b.size()) n <<= 1; + fa.resize(n), fb.resize(n); + + // Evaluating Polynomials. + fa = fft(fa, n); + fb = fft(fb, n); + + // Multiplying Polynomials. + for(int i=0;i res(n); + for(int i=0;i>t; + + while(t--){ + cin>>n; + vector a(n+1), b(n+1); + + for(int i=0;i<=n;i++) cin>>a[i]; + for(int i=0;i<=n;i++) cin>>b[i]; + + vector res = multiply(a, b); + + for(int i=0;i<=2*n;i++) cout<