Submission #1334371

#TimeUsernameProblemLanguageResultExecution timeMemory
1334371yhkhooWind Turbines (EGOI25_windturbines)C++17
22 / 100
510 ms132660 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

typedef pair<int, int> pii;
#define fi first
#define se second

const int MAXN = 100005, MAXQ = 200005;

struct edge{
    int u, v, c;
};

bool operator<(const edge& a, const edge& b){
    return a.c < b.c;
}

struct inter{
    int l, r, x;
    inter(){

    }
    inter(int L, int R, int X){
        l = L, r = R, x = X;
    }
};

bool operator<(const inter& a, const inter& b){
    return a.l < b.l;
}
bool operator>(const inter& a, const inter& b){
    return a.l > b.l;
}

#define lsb(x) ((x) & (-(x)))

struct fenwick{
    int arr[MAXN];
    void update(int X, int V){
        for(; X < MAXN; X += lsb(X)){
            arr[X] += V;
        }
    }
    int query(int X){
        int ret = 0;
        for(; X; X -= lsb(X)){
            ret += arr[X];
        }
        return ret;
    }
} fw;

int n, m, q;
set<int> s[MAXN];
int p[MAXN], ans[MAXQ];
edge el[MAXN];
deque<inter> il[MAXN];
inter ql[MAXQ];

int par(int x){
    if(p[x] == x) return x;
    return (p[x] = par(p[x]));
}

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m >> q;
    for(int i=0; i<n; i++){
        p[i] = i;
        s[i] = {i};
    }
    for(int i=0, ui, vi, ci; i<m; i++){
        cin >> ui >> vi >> ci;
        el[i] = {ui, vi, ci};
    }
    sort(el, el+m);
    int total = 0;
    for(int i=0; i<m; i++){
        auto [ui, vi, ci] = el[i];
        ui = par(ui);
        vi = par(vi);
        if(ui == vi) continue;
        total += ci;
        if(s[ui].size() > s[vi].size()) swap(ui, vi);
        int pj = -1;
        for(auto j: s[ui]){
            auto nj = s[ui].upper_bound(j);
            auto l = s[vi].lower_bound(j);
            if(l != s[vi].begin() && *l > pj){
                l--;
                il[i].emplace_back(*l, j, i);
            }
            auto r = s[vi].upper_bound(j);
            if(r != s[vi].end() && (nj == s[ui].end() || *r < *nj)){
                il[i].emplace_back(j, *r, i);
            }
            //cerr << pj << ' ' << j << ' ' << *nj << ':' << *l << ' ' << *r << '\n';
            pj = j;
        }
        p[ui] = vi;
        for(auto j: s[ui]){
            s[vi].insert(j);
        }
        /*cerr << '\n' << i << '\n';
        cerr << ui << ' ' << vi << ' ' << ci << '\n';
        for(auto j: il[i]){
            cerr << j.l << ',' << j.r << ' ';
        }*/
    }
    priority_queue<inter, vector<inter>, greater<inter>> in;
    for(int i=0; i<m; i++){
        if(!il[i].size()) continue;
        in.push(il[i].front());
        fw.update(il[i].front().r, -el[i].c);
        il[i].pop_front();
    }
    for(int i=0, li, ri; i<q; i++){
        cin >> li >> ri;
        ql[i] = {li, ri, i};
    }
    sort(ql, ql+q);
    auto qlp = ql;
    for(int i=0; i<n; i++){
        inter cur;
        while(in.size() && (cur = in.top()).l < i){
            in.pop();
            fw.update(cur.r, el[cur.x].c);
            if(il[cur.x].size()){
                in.push(il[cur.x].front());
                fw.update(il[cur.x].front().r, -el[cur.x].c);
                il[cur.x].pop_front();
            }
        }
        while(qlp != ql+q && qlp->l == i){
            ans[qlp->x] = fw.query(qlp->r);
            qlp++;
        }
    }
    for(int i=0; i<q; i++){
        cout << total + 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...