이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// #pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct segtree{
    vector<pair<int,int>> tree;
    segtree():tree(524288){}
    void update(int k,int x){
        k+=262144;
        tree[k] = {x,k-262144};
        while(k/=2){
            tree[k]=max(tree[2*k],tree[2*k+1]);
        }
    }
    int get(int l,int r){
        l+=262144;r+=262144;
        pair<int,int> ans = {0,0};
        while(l<=r){
            if(l&1)ans=max(ans,tree[l++]);
            if(r%2==0)ans=max(ans,tree[r--]);
            l/=2;r/=2;
        }
        return ans.second;
    }
};
pair<int,int> adj[200001];
int tree[200001];
vector<pair<int,int>> chains[200001];
int arr[200001];
int stidx[200001];
int lift[18][200001];
int idx[200001];
int DP[200001];
segtree seg;
int c;
void place(int x,int y,int c){
    int node = idx[x];
    for(int bit=17;bit>=0;bit--){
        if(tree[lift[bit][node]]<y)node = lift[bit][node];
    }
    chains[node].emplace_back(x,c);
}
void build(int x,int l,int r){
    int mid = seg.get(l,r);
    idx[mid] = x;
    tree[x] = arr[mid];
    stidx[x] = mid;
    if(mid!=l){
        adj[x].first = ++c;
        lift[0][c] = x;
        build(c,l,mid-1);
    }
    if(mid!=r){
        adj[x].second = ++c;
        lift[0][c] = x;
        build(c,mid+1,r);
    }
}
void merge(pair<int,map<int,int>> &a,pair<int,map<int,int>> &b){
    if(a.second.size()<b.second.size())swap(a,b);
    int offset = b.first-a.first;
    for(auto[x,y]:b.second){
        a.second[x] = y+offset; 
    }
}
pair<int,map<int,int>> calc(int x){
    pair<int,map<int,int>> curr = {0,{}};
    pair<int,map<int,int>> l = {0,{}},r = {0,{}};
    if(adj[x].first)l=calc(adj[x].first);
    if(adj[x].second)r=calc(adj[x].second);
    l.first+=DP[adj[x].second];
    r.first+=DP[adj[x].first];
    merge(curr,l);
    merge(curr,r);
    DP[x] = DP[adj[x].first]+DP[adj[x].second];
    curr.second[stidx[x]] = DP[x]-curr.first;
    for(auto[a,b]:chains[x]){
        DP[x] = max(DP[x],curr.second[a]+curr.first+b);
    }
    return move(curr);
}
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    for(int i=1;i<=n;i++){cin>>arr[i];seg.update(i,arr[i]);}
    build(++c,1,n);
    assert(c==n);
    for(int bit=1;bit<18;bit++){
        for(int i=1;i<=n;i++){
            lift[bit][i] = lift[bit-1][lift[bit-1][i]];
        }
    }
    tree[0] = 1e15;
    int m;
    cin >> m;
    int sum = 0;
    for(int i=1;i<=m;i++){
        int x,y,c;cin>>x>>y>>c;
        place(x,y,c);
        sum+=c;
    }
    calc(1);
    cout << sum-DP[1] << '\n';
}
컴파일 시 표준 에러 (stderr) 메시지
constellation3.cpp: In function 'std::pair<long long int, std::map<long long int, long long int> > calc(long long int)':
constellation3.cpp:87:16: warning: moving a local object in a return statement prevents copy elision [-Wpessimizing-move]
   87 |     return move(curr);
      |            ~~~~^~~~~~
constellation3.cpp:87:16: note: remove 'std::move' call| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |