Submission #1224193

#TimeUsernameProblemLanguageResultExecution timeMemory
1224193Bui_Quoc_CuongBridges (APIO19_bridges)C++20
59 / 100
3094 ms5064 KiB
#include<bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
#define FORD(i, a, b) for (int i = (a), _b = (b); i >= _b; i--)
#define fi first
#define se second
#define pb push_back
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) (int)(a.size())
#define BIT(mask, a) ((mask>>(a))&1)
#define MASK(A) (1LL<<(A))
#define ll long long
#define pii pair<int,int>
template <class A,class B> bool maxi(A &a, const B b){if(a < b){a = b; return 1;} return 0;}
template <class A,class B> bool mini(A &a, const B b){if(a > b){a = b; return 1;} return 0;}
const int N = 3e5 + 5, oo = 2e9, MOD = 1e9 + 7;
const ll INF = 1e18;
const int SQRT = 350;

int n, m;
int q;
int mark[N];
int last[N];
int ans[N];

struct Edges
{
	int u,v,w;
}E[N];
struct Queries
{
	int t,u,w;
} Q[N];

int lab[N];
struct Data
{
	int u,lu,v,lv;
}; stack<Data>memo;
int find(int x) 
{
	return lab[x] < 0 ? x : find(lab[x]);
}
bool joint(int u,int v)
{
	int x=find(u),y=find(v);
	if(x==y) return 0;
	if(lab[x]>lab[y])swap(x,y);
	memo.push({x,lab[x],y,lab[y]});
	lab[x]+=lab[y];
	lab[y]=x;
	return 1;
}
int get_ver()
{
	return memo.size();
}
void rollback(int vers)
{
	while(SZ(memo)>vers)
	{
		lab[memo.top().u]=memo.top().lu;
		lab[memo.top().v]=memo.top().lv;
		memo.pop();
	}
}

void process()
{
	cin >> n >> m;
	FOR(i, 1, m)
	{
		int u, v, w; cin >> u >> v >> w;
		E[i] = {u, v, w};
	}    
	cin >> q;	
	FOR(i, 1, q)
	{
		cin >> Q[i].t>>Q[i].u >>Q[i].w;
	}
	FOR(i, 1, n) lab[i] = - 1;
	for(int _t = 1; _t <= q; _t+= SQRT)
	{
		int L = _t, R = min(q, _t + SQRT - 1);
	
		vector <int> joints, no_joint, qry;		

		FOR(i, L, R)
		{
			if(Q[i].t == 1) mark[Q[i].u] = 1;
			else qry.push_back(i);
		}
		FOR(i, 1, m) 
		{
			if(mark[i]) joints.push_back(i);
			else no_joint.push_back(i);
		}

		sort(ALL(no_joint), [&](int u, int v)
		{
			return E[u].w > E[v].w;
		});
		sort(ALL(qry), [&](int u, int v)
		{
			return Q[u].w > Q[v].w;
		});

		int it = 0;
		for(int id : qry)
		{
			while(it<SZ(no_joint) && E[no_joint[it]].w >= Q[id].w)
			{
				joint(E[no_joint[it]].u,E[no_joint[it]].v);
				it++;
			}
			int vers = get_ver();

			FOR(i,L,id)
			{
				if(Q[i].t==1) last[Q[i].u]=i;
			}

			for(int x : joints)
			{
				if(last[x])
				{
					if(Q[last[x]].w >= Q[id].w)
					{
						joint(E[x].u,E[x].v);
					} 
				} else
				{
					if(E[x].w>=Q[id].w)
					{
						joint(E[x].u,E[x].v);
					}
				}
			}

			ans[id] = abs(lab[find(Q[id].u)]);
			rollback(vers);
			for(int x : joints) last[x] = 0;
		}		

		FOR(i, L, R) if(Q[i].t == 1) E[Q[i].u].w = Q[i].w;
		FOR(i, 1, m) mark[i] = 0;
		rollback(0);
	}

	FOR(i,1,q) if(Q[i].t==2) cout << ans[i] << "\n";
}	

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    #define taskname "kieuoanh"
    if(fopen(taskname".inp", "r"))
    {
        freopen(taskname".inp", "r", stdin);
        freopen(taskname".out", "w", stdout);
    }
    int tc = 1; 
    //cin >> tc;
    while(tc--) process();
    return 0;
}

Compilation message (stderr)

bridges.cpp: In function 'int main()':
bridges.cpp:160:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  160 |         freopen(taskname".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:161:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  161 |         freopen(taskname".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...