#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int MAXN = 100010;
int n, m, q;
int raizQ;
int ans[MAXN];
int indInside[MAXN];
int lastWeight[MAXN];
int anc[MAXN], sz[MAXN];
int U[MAXN], V[MAXN], W[MAXN];
bool mark[MAXN];
bool insideBlock[MAXN];
vector<int> adj[MAXN];
vector<pii> queries;
vector< pair<int,pii> > sweep;
int find(int cur)
{
if( anc[cur] == cur ) return cur;
return anc[cur] = find( anc[cur] );
}
void join(int i, int j)
{
i = find(i); j = find(j);
if( i == j ) return;
if( sz[i] < sz[j] )
swap( i , j );
anc[j] = i;
sz[i] += sz[j];
}
bool isUpdate(int i)
{
int val = queries[i].second;
return ( val > 0 );
}
void initDSU()
{
for(int i = 1 ; i <= n ; i++)
sz[i] = 1, anc[i] = i;
}
int DFS(int cur)
{
mark[cur] = true;
int ans = sz[cur];
for(int i = 0 ; i < (int)adj[cur].size() ; i++)
if( !mark[ adj[cur][i] ] ) ans += DFS( adj[cur][i] );
return ans;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i = 1 ; i <= m ; i++)
scanf("%d %d %d",&U[i],&V[i],&W[i]);
scanf("%d",&q);
raizQ = 1200;
for(int i = 1 ; i <= q ; i++)
{
int type;
scanf("%d",&type);
if( type == 1 )
{
int edge, newW;
scanf("%d %d",&edge,&newW);
queries.push_back( { newW , edge } );
}
if( type == 2 )
{
int s, maxW;
scanf("%d %d",&s,&maxW);
queries.push_back( { maxW , -s } );
}
ans[i - 1] = -1;
}
int lastBlock = (q - 1)/raizQ;
for(int i = 1 ; i <= m ; i++)
lastWeight[i] = W[i];
for(int block = 0 ; block <= lastBlock ; block++)
{
//printf("+============================+ Processando bloco %d\n",block);
int L = block*raizQ;
int R = (block + 1)*raizQ - 1;
R = min( R , q - 1 );
vector<int> inside;
sweep.clear();
for(int i = L ; i <= R ; i++)
{
if( isUpdate( i ) )
{
int edge = queries[i].second;
if( !insideBlock[edge] )
{
indInside[edge] = (int)inside.size();
//printf(".. edge = %d\n",edge);
insideBlock[edge] = true;
inside.push_back( edge );
}
}
else
{
int maxW = queries[i].first;
int source = -queries[i].second;
//printf("Achei query %d %d\n",source,maxW);
sweep.push_back( { maxW , { -source , i } } );
}
}
for(int i = 1 ; i <= m ; i++)
if( !insideBlock[i] ) sweep.push_back( { lastWeight[i] , { U[i] , V[i] } } );//, printf("Adicionei %d: %d -> %d com peso %d\n",i,U[i],V[i],lastWeight[i]);
//printf("\n\n\n");
//printf("------- Sweep Algorithm\n");
sort( sweep.begin() , sweep.end() );
initDSU();
for(int i = (int)sweep.size() - 1 ; i >= 0 ; i--)
{
int type = 0;
if( sweep[i].second.first < 0 ) type = 1;
if( type == 0 )//Update
{
int curU = sweep[i].second.first;
int curV = sweep[i].second.second;
//printf("Juntei %d %d\n",curU,curV);
join( curU , curV );
}
if( type == 1 )
{
int maxW = sweep[i].first;
int ind = sweep[i].second.second;
int source = -sweep[i].second.first;
//printf("Respondendo query maxW = %d source = %d ind = %d\n",maxW,source,ind);
vector<int> weightInside;
for(int j = 0 ; j < (int)inside.size() ; j++)
weightInside.push_back( lastWeight[ inside[j] ] );
for(int j = L ; j < ind ; j++)
{
if( isUpdate( j ) )
{
int newW = queries[j].first;
int edge = queries[j].second;
weightInside[ indInside[edge] ] = newW;
}
}
vector<int> nodes;
for(int j = 0 ; j < (int)inside.size() ; j++)
{
//printf("...... Tentando colocar %d -> %d com peso %d\n",U[ inside[j] ],V[ inside[j] ],weightInside[j]);
if( weightInside[j] >= maxW )
{
int curU = find( U[ inside[j] ] );
int curV = find( V[ inside[j] ] );
if( !mark[curU] ) nodes.push_back( curU ), mark[curU] = true;
if( !mark[curV] ) nodes.push_back( curV ), mark[curV] = true;
adj[curU].push_back( curV );
adj[curV].push_back( curU );
}
}
nodes.push_back( find(source) );
for(int i = 0 ; i < (int)nodes.size() ; i++)
mark[ nodes[i] ] = false;
ans[ind] = DFS( find(source) );
for(int i = 0 ; i < (int)nodes.size() ; i++)
mark[ nodes[i] ] = false, adj[ nodes[i] ].clear();
}
}
for(int i = 0 ; i < (int)inside.size() ; i++)
insideBlock[ inside[i] ] = false;
for(int i = L ; i <= R ; i++)
{
if( isUpdate( i ) )
{
int newW = queries[i].first;
int edge = queries[i].second;
lastWeight[edge] = newW;
}
}
}
for(int i = 0 ; i < q ; i++)
if( ans[i] != -1 ) printf("%d\n",ans[i]);
}
Compilation message
bridges.cpp: In function 'int main()':
bridges.cpp:69:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d",&n,&m);
~~~~~^~~~~~~~~~~~~~~
bridges.cpp:72:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d %d",&U[i],&V[i],&W[i]);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:74:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&q);
~~~~~^~~~~~~~~
bridges.cpp:80:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&type);
~~~~~^~~~~~~~~~~~
bridges.cpp:85:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d",&edge,&newW);
~~~~~^~~~~~~~~~~~~~~~~~~~~
bridges.cpp:92:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d",&s,&maxW);
~~~~~^~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
2688 KB |
Output is correct |
2 |
Correct |
2 ms |
2688 KB |
Output is correct |
3 |
Correct |
66 ms |
2944 KB |
Output is correct |
4 |
Correct |
16 ms |
2944 KB |
Output is correct |
5 |
Correct |
33 ms |
2944 KB |
Output is correct |
6 |
Correct |
30 ms |
2944 KB |
Output is correct |
7 |
Correct |
35 ms |
2944 KB |
Output is correct |
8 |
Correct |
34 ms |
2944 KB |
Output is correct |
9 |
Correct |
41 ms |
2944 KB |
Output is correct |
10 |
Correct |
35 ms |
2944 KB |
Output is correct |
11 |
Correct |
35 ms |
2944 KB |
Output is correct |
12 |
Correct |
37 ms |
2944 KB |
Output is correct |
13 |
Correct |
45 ms |
2944 KB |
Output is correct |
14 |
Correct |
42 ms |
2944 KB |
Output is correct |
15 |
Correct |
39 ms |
2944 KB |
Output is correct |
16 |
Correct |
44 ms |
2944 KB |
Output is correct |
17 |
Correct |
37 ms |
2944 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2277 ms |
7424 KB |
Output is correct |
2 |
Correct |
2246 ms |
7404 KB |
Output is correct |
3 |
Correct |
2220 ms |
7532 KB |
Output is correct |
4 |
Correct |
2143 ms |
7428 KB |
Output is correct |
5 |
Correct |
2210 ms |
7572 KB |
Output is correct |
6 |
Execution timed out |
3082 ms |
6764 KB |
Time limit exceeded |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1964 ms |
6440 KB |
Output is correct |
2 |
Correct |
1990 ms |
4744 KB |
Output is correct |
3 |
Correct |
2555 ms |
6436 KB |
Output is correct |
4 |
Correct |
1956 ms |
6380 KB |
Output is correct |
5 |
Correct |
142 ms |
4204 KB |
Output is correct |
6 |
Correct |
2296 ms |
6508 KB |
Output is correct |
7 |
Correct |
1789 ms |
6444 KB |
Output is correct |
8 |
Correct |
1491 ms |
6308 KB |
Output is correct |
9 |
Correct |
1131 ms |
6376 KB |
Output is correct |
10 |
Correct |
981 ms |
6188 KB |
Output is correct |
11 |
Correct |
1143 ms |
6360 KB |
Output is correct |
12 |
Correct |
939 ms |
6412 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1254 ms |
8260 KB |
Output is correct |
2 |
Correct |
139 ms |
4204 KB |
Output is correct |
3 |
Correct |
150 ms |
6000 KB |
Output is correct |
4 |
Correct |
171 ms |
6000 KB |
Output is correct |
5 |
Correct |
1375 ms |
8416 KB |
Output is correct |
6 |
Correct |
1217 ms |
8272 KB |
Output is correct |
7 |
Correct |
1342 ms |
8416 KB |
Output is correct |
8 |
Correct |
660 ms |
6632 KB |
Output is correct |
9 |
Correct |
674 ms |
6632 KB |
Output is correct |
10 |
Correct |
667 ms |
6888 KB |
Output is correct |
11 |
Correct |
999 ms |
7468 KB |
Output is correct |
12 |
Correct |
982 ms |
7464 KB |
Output is correct |
13 |
Correct |
988 ms |
7592 KB |
Output is correct |
14 |
Correct |
1321 ms |
8396 KB |
Output is correct |
15 |
Correct |
1316 ms |
8424 KB |
Output is correct |
16 |
Correct |
1242 ms |
8288 KB |
Output is correct |
17 |
Correct |
1250 ms |
8260 KB |
Output is correct |
18 |
Correct |
1230 ms |
8268 KB |
Output is correct |
19 |
Correct |
1232 ms |
8256 KB |
Output is correct |
20 |
Correct |
1083 ms |
7948 KB |
Output is correct |
21 |
Correct |
1081 ms |
7912 KB |
Output is correct |
22 |
Correct |
1197 ms |
8424 KB |
Output is correct |
23 |
Correct |
1140 ms |
7812 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2277 ms |
7424 KB |
Output is correct |
2 |
Correct |
2246 ms |
7404 KB |
Output is correct |
3 |
Correct |
2220 ms |
7532 KB |
Output is correct |
4 |
Correct |
2143 ms |
7428 KB |
Output is correct |
5 |
Correct |
2210 ms |
7572 KB |
Output is correct |
6 |
Execution timed out |
3082 ms |
6764 KB |
Time limit exceeded |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
2688 KB |
Output is correct |
2 |
Correct |
2 ms |
2688 KB |
Output is correct |
3 |
Correct |
66 ms |
2944 KB |
Output is correct |
4 |
Correct |
16 ms |
2944 KB |
Output is correct |
5 |
Correct |
33 ms |
2944 KB |
Output is correct |
6 |
Correct |
30 ms |
2944 KB |
Output is correct |
7 |
Correct |
35 ms |
2944 KB |
Output is correct |
8 |
Correct |
34 ms |
2944 KB |
Output is correct |
9 |
Correct |
41 ms |
2944 KB |
Output is correct |
10 |
Correct |
35 ms |
2944 KB |
Output is correct |
11 |
Correct |
35 ms |
2944 KB |
Output is correct |
12 |
Correct |
37 ms |
2944 KB |
Output is correct |
13 |
Correct |
45 ms |
2944 KB |
Output is correct |
14 |
Correct |
42 ms |
2944 KB |
Output is correct |
15 |
Correct |
39 ms |
2944 KB |
Output is correct |
16 |
Correct |
44 ms |
2944 KB |
Output is correct |
17 |
Correct |
37 ms |
2944 KB |
Output is correct |
18 |
Correct |
2277 ms |
7424 KB |
Output is correct |
19 |
Correct |
2246 ms |
7404 KB |
Output is correct |
20 |
Correct |
2220 ms |
7532 KB |
Output is correct |
21 |
Correct |
2143 ms |
7428 KB |
Output is correct |
22 |
Correct |
2210 ms |
7572 KB |
Output is correct |
23 |
Execution timed out |
3082 ms |
6764 KB |
Time limit exceeded |
24 |
Halted |
0 ms |
0 KB |
- |