Advertisement
a53

TrumpLandia

a53
Mar 11th, 2017
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.28 KB | None | 0 0
  1. #include <fstream>
  2. #include <algorithm>
  3. #include <vector>
  4. #define x first
  5. #define y second
  6. using namespace std;
  7. ifstream f("trumplandia.in"); ofstream g("trumplandia.out");
  8. int n,m,q;
  9. struct art {int x,y,c,d,viz;} a[200010],sol[200010];
  10. long long facut[200010];
  11. int T[32][200010],Lev[200010];
  12. int viz[200010],inv[200010],GR[200010];
  13. vector <pair<int,int> > G[2*200010];
  14. int grupa(int i)
  15. { if (GR[i] == i) return i;
  16. GR[i] = grupa(GR[i]);
  17. return GR[i];
  18. }
  19. void reuniune(int i,int j)
  20. { GR[grupa(i)]=grupa(j);}
  21. int cmp(art h, art l)
  22. { if(h.c<l.c) return 1;
  23. return 0;
  24. }
  25. int lca(int x, int y)
  26. {
  27. if(Lev[x] < Lev[y])
  28. swap(x, y);
  29. int log1, log2;
  30. for(log1 = 1; (1 << log1) < Lev[x]; ++log1);
  31. for(log2 = 1; (1 << log2) < Lev[y]; ++log2);
  32. for(int k = log1; k >= 0; --k)
  33. if(Lev[x] - (1 << k) >= Lev[y])
  34. x = T[k][x];
  35. if(x == y) return x;
  36. for(int k = log2; k >= 0; --k)
  37. if(T[k][x] && T[k][x] != T[k][y])
  38. x = T[k][x],
  39. y = T[k][y];
  40. return T[0][x];
  41. }
  42. void dfs(int nod, int lev)
  43. { Lev[nod]=lev; viz[nod]=1;
  44. vector <pair<int,int> > :: iterator it=G[nod].begin(),sf=G[nod].end();
  45. for(; it!=sf; it++)
  46. if(viz[(*it).x]==0) {T[0][(*it).x]=nod; dfs((*it).x, lev+1);}
  47. }
  48. int main()
  49. { f>>n>>m>>q;
  50. for(int i=1; i<=m; i++) {f>>a[i].x>>a[i].y>>a[i].c; a[i].d=i;}
  51. for(int i = 1;i <= n; ++i) GR[i]=i;
  52. sort(a+1,a+m+1,cmp);
  53. for(int i=1; i<=m; i++) inv[a[i].d]=i;
  54. long long ct=0,k=0;
  55. for(int i = 1;i <= m; ++i)
  56. if(grupa(a[i].x)!=grupa(a[i].y))
  57. { ct=1LL*(ct+a[i].c);
  58. a[i].viz=1;
  59. sol[++k]=a[i];
  60. reuniune(a[i].x,a[i].y);
  61. }
  62. for(int i=1; i<=k; i++)
  63. { G[sol[i].x].push_back(make_pair(sol[i].y,sol[i].c));
  64. G[sol[i].y].push_back(make_pair(sol[i].x,sol[i].c));
  65. }
  66. dfs(1,0);
  67. g<<ct<<'\n';
  68. for(k = 1; (1 << k) <= n; ++k)
  69. for(int i = 1; i <= n; ++i)
  70. T[k][i] = T[k-1][T[k-1][i]];
  71. for(int mc,i=1; i<=q; i++)
  72. { f>>mc;
  73. int leg=inv[mc];
  74. if(a[leg].viz==1) g<<ct<<'\n';
  75. else
  76. { if(facut[leg]!=0) g<<facut[leg]<<'\n';
  77. else
  78. { int lc=lca(a[leg].x,a[leg].y);
  79. int cur=a[leg].x;
  80. int vmax=0;
  81. for(int k=0; (1<<k)<=n; ++k)
  82. while(T[k][cur]!=0 and cur!=lc)
  83. { vector<pair<int,int> > :: iterator it=G[cur].begin(), sf=G[cur].end();
  84. for(; it!=sf; it++)
  85. if((*it).x==T[k][cur] and (*it).y>vmax) vmax=(*it).y;
  86. cur=T[k][cur];
  87. }
  88. cur=a[leg].y;
  89. for(int k=0; (1<<k)<=n; ++k)
  90. while(T[k][cur]!=0 and cur!=lc)
  91. {
  92. vector<pair<int,int> > :: iterator it=G[cur].begin(), sf=G[cur].end();
  93. for(; it!=sf; it++)
  94. if((*it).x==T[k][cur] and (*it).y>vmax) vmax=(*it).y;
  95. cur=T[k][cur];
  96. }
  97. facut[leg]=1LL*(ct-vmax+a[leg].c);
  98. g<<facut[leg]<<'\n';
  99. }
  100. }
  101. }
  102. g.close(); return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement