Submission #1354099

#TimeUsernameProblemLanguageResultExecution timeMemory
1354099kokokaiFood Court (JOI21_foodcourt)C++20
100 / 100
273 ms46436 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "text"
#define int long long
const int N = 255551;
int n,m,q;
struct segtree{
    int st[4*N],lz[4*N];
    void update(int id,int l,int r,int p,int val){
        if(l==r){
            st[id]=val;
            return;
        }
        int mid=(l+r)>>1;
        if(mid<p) update(id<<1|1,mid+1,r,p,val);
        else update(id<<1,l,mid,p,val);
        st[id]=(st[id<<1]+st[id<<1|1]);
    }
    void down(int id){
        if(lz[id]==0) return;
        int t=lz[id];
        lz[id<<1]+=t;
        lz[id<<1|1]+=t;
        st[id<<1]+=t;
        st[id<<1|1]+=t;
        lz[id]=0;
        return;
    }
    void updrange(int id,int l,int r,int u,int v,int val){
        if(r<u || v<l) return;
        if(u<=l && r<=v){
            st[id]+=val;
            lz[id]+=val;
            return;
        }
        int mid=(l+r)>>1;
        down(id);
        updrange(id<<1,l,mid,u,v,val);
        updrange(id<<1|1,mid+1,r,u,v,val);
        st[id]=min(st[id<<1],st[id<<1|1]);
    }
    int getmin(int id,int l,int r,int u,int v){
        if(r<u || v<l) return 2e18;
        if(u<=l && r<=v) return st[id];
        int mid=(l+r)>>1;
        down(id);
        return min(getmin(id<<1,l,mid,u,v),getmin(id<<1|1,mid+1,r,u,v));
    }
    int getsum(int id,int l,int r,int u,int v){
        if(r<u || v<l) return 0;
        if(u<=l && r<=v) return st[id];
        int mid=(l+r)>>1;
        return getsum(id<<1,l,mid,u,v)+getsum(id<<1|1,mid+1,r,u,v);
    }
    int findkth(int id,int l,int r,int k){
        if(l==r){
            return l;
        }
        int mid=(l+r)>>1;
        if(st[id<<1]>=k) return findkth(id<<1,l,mid,k);
        else return findkth(id<<1|1,mid+1,r,k-st[id<<1]);
    }
}stsum,stmin,stk;
struct que{
    int t,l,r,c,k;
}query[N];
vector<pair<int,int>> eve[N];
int ans[N];
signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);
    if(fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
    }
    cin>>n>>m>>q;
    for(int i=1;i<=q;i++){
        int t;
        cin>>t;
        if(t == 1){
            int l,r,c,k;
            cin>>l>>r>>c>>k;
            query[i]={t,l,r,c,k};
            eve[l].push_back({i,1});
            eve[r+1].push_back({i,-1});
        }else if(t == 2){
            int l,r,k;
            cin>>l>>r>>k;
            query[i]={t,l,r,0,k};
            eve[l].push_back({i,1});
            eve[r+1].push_back({i,-1});
        }else{
            int a,b;
            cin>>a>>b;
            query[i]={t,a,0,0,b};
            eve[a].push_back({i,1});
        }
    }
    for(int i=1;i<=n;i++){
        for(auto &[id,type]:eve[i]){
            if(query[id].t == 1){
                if(type == 1){
                    stsum.update(1,1,q,id,query[id].k);
                    stk.update(1,1,q,id,query[id].k);
                    stmin.updrange(1,1,q,id,q,query[id].k);
                }else{
                    stsum.update(1,1,q,id,0);
                    stk.update(1,1,q,id,0);
                    stmin.updrange(1,1,q,id,q,-query[id].k);
                }
            }else if(query[id].t == 2){
                if(type == 1){
                    stsum.update(1,1,q,id,-query[id].k);
                    stmin.updrange(1,1,q,id,q,-query[id].k);
                }else{
                    stsum.update(1,1,q,id,0);
                    stmin.updrange(1,1,q,id,q,query[id].k);
                }
            }
        }
        for(auto &[id,tmp]:eve[i]){
            if(query[id].t == 3){
                int p=id;
                int kth=query[id].k;
                int sum=stsum.getsum(1,1,q,1,p);
                int mnsum=min(0LL,stmin.getmin(1,1,q,1,p));
                int rsum=sum-mnsum;
                if(kth <= rsum){
                    int tru=rsum-kth;
                    int rk=stk.getsum(1,1,q,1,p)-tru;
                    int findp=stk.findkth(1,1,q,rk);
                    ans[id]=query[findp].c;
                }else{
                    ans[id]=0;
                }
            }
        }
    }
    for(int i=1;i<=q;i++){
        if(query[i].t == 3){
            cout<<ans[i]<<'\n';
        }
    }
}

Compilation message (stderr)

foodcourt.cpp: In function 'int main()':
foodcourt.cpp:75:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...