Submission #1341107

#TimeUsernameProblemLanguageResultExecution timeMemory
1341107aykhnWind Turbines (EGOI25_windturbines)C++20
100 / 100
341 ms68360 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int MXN = 2e5 + 5;

struct BIT
{
  int n;
  vector<int> ft;
  void init(int N)
  {
    n = N + 5;
    ft.assign(n + 5, 0);
  }
  void add(int pos, int val)
  {
    for (pos = pos + 1; pos <= n; pos += pos & -pos) ft[pos] += val;
  }
  int get(int pos, int res = 0)
  {
    for (pos = pos + 1; pos > 0; pos -= pos & -pos) res += ft[pos];
    return res;
  }
  int query(int l, int r)
  {
    return get(r) - get(l - 1);
  }
};

int n, m, Q;
int e[MXN], mst = 0;
set<int> idx[MXN];
vector<array<int, 2>> addq[MXN], ansq[MXN];
int ans[MXN];
BIT ft;

int get(int x)
{
  if (e[x] < 0) return x;
  return e[x] = get(e[x]);
}
int unite(int x, int y, int id)
{
  x = get(x), y = get(y);
  if (x == y) return 0;
  if (e[x] > e[y]) swap(x, y);
  for (int z : idx[y])
  {
    auto it = idx[x].lower_bound(z);
    if (it != idx[x].end()) addq[*it].push_back({z, id});
    if (it != idx[x].begin()) addq[z].push_back({*prev(it), id});
  }
  for (int z : idx[y]) idx[x].insert(z);
  e[x] += e[y];
  e[y] = x;
  idx[y].clear();
  return 1;
}


signed main()
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> Q;
  for (int i = 0; i < n; i++) e[i] = -1, idx[i] = {i};
  array<int, 3> ed[m];
  for (auto &[w, u, v] : ed) cin >> u >> v >> w;
  sort(ed, ed + m);
  for (int i = 0; i < m; i++)
  {
    auto &[w, u, v] = ed[i];
    mst += unite(u, v, i) * w;
  }
  for (int i = 0; i < Q; i++)
  {
    int l, r;
    cin >> l >> r;
    ansq[r].push_back({l, i});
  }
  ft.init(n);
  vector<int> cur(m, -1);
  for (int i = 0; i < n; i++)
  {
    for (auto &[l, id] : addq[i])
    {
      if (cur[id] != -1) ft.add(cur[id], -ed[id][0]);
      cur[id] = max(cur[id], l);
      ft.add(cur[id], ed[id][0]);
    }
    for (auto &[l, id] : ansq[i])
    {
      ans[id] = mst - ft.query(l, i);
    }
  }
  for (int i = 0; i < Q; i++) cout << ans[i] << '\n';
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...