Submission #985894

#TimeUsernameProblemLanguageResultExecution timeMemory
985894AlperenT_Food Court (JOI21_foodcourt)C++17
100 / 100
672 ms93940 KiB
#include <bits/stdc++.h>
 
#pragma GCC optimize("O3,unroll-loops")
#define pb push_back
#define F first
#define S second 
#define all(a) a.begin(),a.end()
#define pii pair <int,int>
#define PII pair<pii , pii>
#define ld long double
#define int long long
#define sz(v) (int)v.size()
#define rep(i , a , b) for(int i=a;i <= b;i++)
#define per(i , a , b) for(int i=a;i >= b;i--)
using namespace std ;
const int maxn = 3e5 + 10  , N = 1e5 +1 , lg = 20 , maxq = 202   , inf = 1e9  , maxk = 2022  , mod =998244353;
int n , q  , m , ds[maxn] , ans[maxn ] , ty[maxn];
struct n1{
    int mn , lz ,id = 0;
    n1(){
        mn =0 , lz =0 ; 
    }
};
n1 s1[4*maxn] ;
n1 operator+(n1 a , n1 b){
    n1 r ;
    r.mn = min(a.mn , b.mn);
    r.lz =0 ;
    if(a.mn == r.mn)r.id = a.id ;
    if(b.mn == r.mn)r.id = b.id;
    return r ;
}
void sh1(int p){
    int pl = p<<1,pr=p<<1|1;
    s1[pl].lz += s1[p].lz ;
    s1[pr].lz += s1[p].lz ;
    s1[pl].mn += s1[p].lz ;
    s1[pr].mn += s1[p].lz ;
    s1[p].lz =0 ;
}
void bui(int p = 1 , int l = 0 , int r = q){
    int pl = p<<1 ,pr=p<<1|1  ,mid=(l+r)/2 ;
    if(l == r){
        s1[p].id = l ;
        s1[p].mn = 0;
        return ;
    }
    bui(pl,l,mid);bui(pr,mid+1,r);
    s1[p] = s1[pl] + s1[pr];
}
void upd(int le, int ri ,int x , int p =1 , int l = 0 , int r =q){
    int pl = p<<1 ,pr=p<<1|1  ,mid=(l+r)/2 ;
    if(le > r|| l > ri)return ;
    if(l!=r)sh1(p);
    if(le <= l && r <= ri){
        s1[p].lz += x;
        s1[p].mn += x; 
        return ;
    }    
    upd(le,ri,x,pl,l,mid);
    upd(le,ri,x,pr,mid+1,r);
    s1[p]= s1[pl] + s1[pr]; 
}
n1 que(int le, int ri , int p= 1 ,int l =0 , int r = q){
    int mid = (l+r)/2 , pl=p<<1,pr=p<<1|1;
    if(le <= l && r <= ri)return s1[p];
    sh1(p);
    if(mid >= ri)return que(le,ri,pl,l,mid);
    if(mid < le)return que(le,ri,pr,mid+1,r);
    return que(le,ri,pl,l,mid) + que(le,ri,pr,mid+1,r) ;
}
 
struct n2{
    int a  , b ;
    n2(){
        a = b =0  ;
    }
};
n2 s2[4*maxn] ;

n2 operator+(n2 a, n2 b){
    n2 r ;
    r.a = a.a + b.a ;
    r.b = a.b + b.b;
    return r; 
}
void upd2(int x , int w, int p = 1, int l = 0 , int r = q){
    int mid = (l+r)/2 ,pl=p<<1,pr=p<<1|1;
    if(l == r){
        if(ty[l] == 1){
            s2[p].a += w;
        }else{
            s2[p].b +=w ;
        }
        return ;
    }
    if(mid < x)upd2(x,w,pr,mid+1,r);
    else upd2(x,w,pl,l,mid);
    s2[p] = s2[pl] + s2[pr] ;
}
n2 que2(int le ,int ri , int p= 1 ,int l =0 , int r = q){
    int mid = (l+r)/2 ,pl=p<<1,pr=p<<1|1;
    if(le <= l && r <= ri)return s2[p];
    if(ri <= mid)return que2(le,ri,pl,l,mid);
    if(le > mid)return que2(le,ri,pr,mid+1,r);
    return que2(le,ri,pl,l,mid) + que2(le,ri,pr,mid+1,r);
}
int w =0 , as =0;
void find(int x ,int p = 1 ,int l =0 , int r = q){
    if(r < x)return ; 
    int pl =p <<1, pr=p<<1|1, mid=(l+r)/2 ;
    if(l < x){
        find(x,pl,l,mid);
        if(as == -1)find(x,pr,mid+1,r) ;
        return ;
    }
    if(l >= x){
        if(w >= s2[p].a){
            w-=s2[p].a;
            return ;
        }
        if(l == r){
            as = l;
            return ;
        }
        find(x,pl,l,mid);
        if(as!=-1)return ;
        find(x,pr,mid+1,r);
    }
}

vector <pii> q1[maxn] ;
vector <pii> v1[maxn] , v2[maxn] ;
 
signed main(){
    ios_base::sync_with_stdio(false); cin.tie(0);
    cin >> n >> m >> q ;
    rep(i , 1 , q){
        int t ;
        cin >> t ;
        ty[i] = t ;
        if(t == 3){
            int a, b ;
            cin >> a >> b;
            q1[a].pb({i , b}) ;
        }
        if(t==2){
            int l ,r , k ;
            cin >> l >> r >> k ;
            v2[l].pb({i , k});
            v1[r+1].pb({i , k}) ;
        }
        if(t==1){
            int l ,r , k , c;
            cin >> l >> r >> c >> k ;
            ds[i] = c; 
            v1[l].pb({i , k});
            v2[r+1].pb({i , k}) ;
        }
        ans[i] = -1 ;
    }
    bui() ;
    rep(t ,1 ,n){
        for(auto [i , k] : v2[t]){
            upd(i, q ,  -k) ;upd2(i , -k); 
        }
        for(auto [i , k] : v1[t]){
            upd(i , q , k) ;upd2(i , k);
        }
        for(auto [i , k] : q1[t]){
            upd(i , i , -(k-1));upd2(i , -(k-1)) ;
            int l = que(0 , i).id ;
            if(l == i){
                ans[i] =0 ;
            }else{
                w = -que2(l+1 , i).b;as =-1 ;
                find(l+1);
                ans[i] = ds[as] ;
            }
            upd(i , i , +(k-1)) ;upd2(i , k-1);
        }
    }
    rep(i ,1 ,q){
        if(ans[i] == -1)continue ;
        cout << ans[i] << "\n"  ;
    }
    cout << "\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...