Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using pi = pair <int, int>;
- const int N = 1e5 + 10;
- const int Q = 2e5 + 10;
- vector <int> g[N], rg[N];
- bool open[N], fr1[N], frn[N];
- pi query[Q];
- int n, m, q;
- void Debug();
- void dfs(int u){
- fr1[u] = true;
- for(auto v: g[u]){
- if(open[v] and !fr1[v]) dfs(v);
- }
- }
- void rdfs(int u){
- frn[u] = true;
- for(auto v: rg[u]){
- if(open[v] and !frn[v]) rdfs(v);
- }
- }
- int main(){
- scanf("%d %d %d", &n, &m, &q);
- for(int i = 1; i <= m; i ++){
- int u, v;
- scanf("%d %d", &u, &v);
- g[u].push_back(v);
- rg[v].push_back(u);
- }
- for(int i = 1; i <= n; i ++)
- open[i] = true;
- for(int i = 1, opr, x; i <= q; i ++){
- scanf("%d %d", &opr, &x);
- query[i] = {opr, x};
- if(opr == 1) open[x] = false;
- }
- dfs(1), rdfs(n);
- stack <int> ans;
- for(int i = q, opr, x; i >= 1; i --){
- opr = query[i].first,
- x = query[i].second;
- if(opr == 1){
- open[x] = true;
- for(auto v: rg[x]){
- if(fr1[v]){
- dfs(x);
- break;
- }
- }
- for(auto v: g[x]){
- if(frn[v]){
- rdfs(x);
- break;
- }
- }
- }
- else if(opr == 2){
- ans.push(fr1[x] and frn[x]);
- }
- }
- while(!ans.empty()){
- printf("%d ", ans.top());
- ans.pop();
- }
- return 0;
- }
- void Debug(){
- printf("Debug\n");
- printf(" open : ");
- for(int i = 1; i <= n; i ++) printf("%d ", open[i]); printf("\n");
- printf(" from1 : ");
- for(int i = 1; i <= n; i ++) printf("%d ", fr1[i]); printf("\n");
- printf(" fromn : ");
- for(int i = 1; i <= n; i ++) printf("%d ", frn[i]); printf("\n");
- printf("\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement