제출 #1146783

#제출 시각아이디문제언어결과실행 시간메모리
1146783ace5푸드 코트 (JOI21_foodcourt)C++20
100 / 100
664 ms66756 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define int ll

const int maxn = 250005;
const ll INF = 2e18;

pair<ll,int> segTree[4*maxn];
ll p[4*maxn];
vector<pair<ll,int>> que[maxn];
vector<pair<ll,int>> que2[maxn];
vector<pair<ll,ll>> atl[maxn];
vector<ll> a;
ll ans[maxn];

void build(int l,int r,int indV)
{
    if(l == r)
    {
        segTree[indV] = {a[l],l};
        p[indV] = 0;
        return ;
    }
    int m = (l+r)/2;
    build(l,m,indV*2+1);
    build(m+1,r,indV*2+2);
    segTree[indV] = min(segTree[indV*2+1],segTree[indV*2+2]);
    p[indV] = 0;
    return ;
}

void push(int l,int r,int indV)
{
    if(l == r)
    {
        segTree[indV].first += p[indV];
        p[indV] = 0;
        return ;
    }
    segTree[indV].first += p[indV];
    p[indV*2+1] += p[indV];
    p[indV*2+2] += p[indV];
    p[indV] = 0;
    return ;
}

void modify(int lx,int rx,ll x,int l,int r,int indV)
{
    push(l,r,indV);
    if(l > rx || r < lx)
        return ;
    else if(l >= lx && r <= rx)
    {
        p[indV] += x;
        push(l,r,indV);
        return ;
    }
    int m = (l+r)/2;
    modify(lx,rx,x,l,m,indV*2+1);
    modify(lx,rx,x,m+1,r,indV*2+2);
    segTree[indV] = min(segTree[indV*2+1],segTree[indV*2+2]);
    return ;
}

pair<ll,int> get(int lx,int rx,int l,int r,int indV)
{
    push(l,r,indV);
    if(l > rx || r < lx)
        return {INF,-1};
    else if(l >= lx && r <= rx)
        return segTree[indV];
    int m = (l+r)/2;
    pair<ll,int> sl = get(lx,rx,l,m,indV*2+1);
    pair<ll,int> sr = get(lx,rx,m+1,r,indV*2+2);
    return min(sl,sr);
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,m,q;
    cin >> n >> m >> q;
    a.resize(n);
    build(0,n,0);
    vector<vector<int>> jop;
    vector<vector<pair<int,int>>> fg(n+1);
    for(int j = 0;j < q;++j)
    {
        ans[j] = -1;
        int t;
        cin >> t;
        if(t == 1)
        {
            int l,r,c,k;
            cin >> l >> r >> c >> k;
            l--;
            r--;
            modify(l,r,k,0,n-1,0);
            fg[l].push_back({j+1,k});
            fg[r+1].push_back({j+1,-k});
            jop.push_back({l,r,c,k,j});
        }
        else if(t == 2)
        {
            int l,r,k;
            cin >> l >> r >> k;
            l--;
            r--;
           // modify(l,r,-k,0,n-1,0);
            fg[l].push_back({j+1,-k});
            fg[r+1].push_back({j+1,k});
        }
        else
        {
            ans[j] = 0;
            ll a,b;
            cin >> a >> b;
            a--;
            b--;
            atl[a].push_back({get(a,a,0,n-1,0).first,0});
            que2[a].push_back({b,j});
        }
    }
    a.resize(q+1);
    build(0,q,0);
    for(int i = 0;i < n;++i)
    {
        for(int u = 0;u < fg[i].size();++u)
        {
            modify(fg[i][u].first,q,fg[i][u].second,0,q,0);
        }
        for(int u = 0;u < que2[i].size();++u)
        {
            atl[i][u].second = get(que2[i][u].second+1,que2[i][u].second+1,0,q,0).first - get(0,que2[i][u].second+1,0,q,0).first;
            if(que2[i][u].first < atl[i][u].second)
                que[i].push_back({que2[i][u].first + atl[i][u].first - atl[i][u].second,que2[i][u].second});
        }
    }
    for(int i = 0;i < n;++i)
    {
        sort(que[i].rbegin(),que[i].rend());
    }
    a.resize(n);
    for(int j = 0;j < n;++j)
    {
        a[j] = (que[j].size() == 0 ? INF : que[j].back().first);
        //cout << a[j] << ' ';
    }
   // cout << endl;
    build(0,n-1,0);
    for(int j = 0;j < jop.size();++j)
    {
        modify(jop[j][0],jop[j][1],-jop[j][3],0,n-1,0);
        while(true)
        {
            pair<ll,int> cc = get(jop[j][0],jop[j][1],0,n-1,0);
            //cout << j << ' ' << cc.first << ' ' << cc.second << endl;
            if(cc.first < 0)
            {
                int pos = cc.second;
                int qpos = que[pos].back().second;
                ans[qpos] = jop[j][2];
                if(que[pos].size() == 1)
                    modify(pos,pos,INF,0,n-1,0);
                else
                    modify(pos,pos,que[pos].rbegin()[1].first-que[pos].back().first,0,n-1,0);
                que[pos].pop_back();
            }
            else
                break;
        }
    }
    for(int j = 0;j < q;++j)
    {
        if(ans[j] != -1)
            cout << ans[j] << "\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...