제출 #1309777

#제출 시각아이디문제언어결과실행 시간메모리
1309777vlomaczkThe Collection Game (BOI21_swaps)C++20
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

ll inf = 1e18;

struct SegmentTreeBeats {
    ll base;
    vector<ll> L,mn,smn;

    SegmentTreeBeats(ll n) {
        ll lvl = ceil(log2(double(n)));
        base = 1<<lvl;
        L.assign(2*base,0);
        mn.assign(2*base,0);
        smn.assign(2*base,inf);
        for(int i=1; i<base; ++i) smn[i] = 0;
    }

    void push(ll v, ll l, ll r) {
        if(L[v]==0 || r>=2*base) return;
        L[l] += L[v];
        L[r] += L[v];
        
        mn[l] += L[v];
        if(smn[l] < inf) smn[l] += L[v];
        mn[r] += L[v];
        if(smn[r] < inf) smn[r] += L[v];

        L[v] = 0;
    }

    void pull(ll v, ll l, ll r) {
        mn[v] = min(mn[l], mn[r]);

        smn[v] = inf;
        if (mn[l] != mn[v]) smn[v] = min(smn[v], mn[l]);
        if (mn[r] != mn[v]) smn[v] = min(smn[v], mn[r]);
        smn[v] = min({smn[v], smn[l], smn[r]});
    }

    void update(ll v, ll a, ll b, ll p, ll k, ll val) {
        if(b < p || k < a) return;
        if(p <= a && b <= k) {
            L[v] += val;
            mn[v] += val;
            if(smn[v] < inf) smn[v] += val;
            return;
        }
        ll l = 2*v; ll r = l+1; ll mid = (a+b)/2;
        push(v,l,r);
        update(l,a,mid,p,k,val);
        update(r,mid+1,b,p,k,val);
        pull(v,l,r);
    }

    void max_with(ll v, ll a, ll b, ll x) {
        if(mn[v] >= x) return;
        if(smn[v] > x) {
            mn[v] = x;
            return;
        }
        ll l = 2*v; ll r = l+1; ll mid = (a+b)/2;
        push(v,l,r);
        max_with(l,a,mid,x);
        max_with(r,mid+1,b,x);
        pull(v,l,r);
    } 

    ll Q(ll v, ll a, ll b, ll x) {
        if(x < a || x > b) return inf;
        if(a==b && a==x) return mn[v];
        ll l = 2*v; ll r = l+1; ll mid = (a+b)/2;
        push(v,l,r);
        return min(Q(l,a,mid,x), Q(r,mid+1,b,x));
    }

    void add(ll l, ll r, ll val) { // Add val to [l,r]
        update(1,0,base-1,l,r,val);
    }

    void max_with_zero() { //Foreach i : a[i] = max(a[i], 0)
        max_with(1,0,base-1,0);
    }

    ll query(ll pos) { // Find value of a[pos]
        return Q(1,0,base-1,pos);
    }
};

struct Block {
	ll type,amount,time;
};

struct SegTree {
    ll base;
    vector<ll> T, L;

    SegTree(ll n) {
        ll lvl = __lg(n) + 1;
        base = 1<<lvl;
        T.assign(2*base, 0);
        L.assign(2*base, 0);
    }

    void push(ll v, ll l, ll r) {
        if(L[v]==0 || r>=2*base) return;
        T[l] += L[v];
        T[r] += L[v];

        L[l] += L[v];
        L[r] += L[v];

        L[v] = 0;
    }

    void update(ll v, ll a, ll b, ll l, ll r, ll val) {
        if(b < l || r < a) return;
        if(l<=a && b<=r) {
            T[v] += val;
            L[v] += val;
            return;
        }
        ll lewy = 2*v; ll prawy = 2*v+1; ll mid=(a+b)/2;
        push(v, lewy, prawy);
        update(lewy,a,mid,l,r,val);
        update(prawy,mid+1,b,l,r,val);
        T[v] = max(T[lewy], T[prawy]);
    }

    ll find(ll v, ll a, ll b, ll x) {
        if(a==b) return v - base;
        ll lewy = 2*v; ll prawy = 2*v+1; ll mid=(a+b)/2;
        push(v, lewy, prawy);
        if(T[lewy] >= x) return find(lewy,a,mid,x);
        return find(prawy,mid+1,b,x);
    }
};

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	ll n,m,q;
	cin >> n >> m >> q;
	vector<ll> ans;
	vector<vector<pair<ll, ll>>> query(n+1);
	vector<vector<Block>> bloki_add(n+1), bloki_del(n+2);
	SegmentTreeBeats stb(n), stb2(n);
	for(ll t=0; t<q; ++t) {
		ll T; cin >> T;
		if(T==1) {
			ll l,r,c,k;
			cin >> l >> r >> c >> k;
            --l; --r;
			bloki_add[l].push_back({c,k,t});
            bloki_del[r+1].push_back({c,k,t});
			stb.add(l,r,k);
			stb2.add(l,r,k);
		} else if(T==2) {
			ll l,r,k;
			cin >> l >> r >> k;
            --l; --r;
			stb.add(l,r,-k);
		} else {
			ll a,b;
			cin >> a >> b;
            --a;
			ans.push_back(-1);
			if(stb.query(a) < b) ans.back() = 0;
			else query[a].push_back({b + stb2.query(a) - stb.query(a), ans.size()-1});
		}
		stb.max_with_zero();
    }
    SegTree st(2*q+1);
    vector<ll> typ(2*q+1);
    for(ll i=0; i<n; ++i) {
        for(auto[c,k,t] : bloki_add[i]) {
            typ[t] = c;
            st.update(1,0,st.base-1,t,st.base-1,k);
        }   
        for(auto[c,k,t] : bloki_del[i]) {
            typ[t] = -1;
            st.update(1,0,st.base-1,t,st.base-1,-k);
        }
        for(auto[poz, idx] : query[i]) ans[idx] = typ[st.find(1,0,st.base-1,poz)];
    }
	for(auto x : ans) cout << x << '\n';

	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/cccyEsLK.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccsgttsM.o:swaps.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/cccyEsLK.o: in function `main':
grader.cpp:(.text.startup+0x67): undefined reference to `solve(int, int)'
collect2: error: ld returned 1 exit status