제출 #1357550

#제출 시각아이디문제언어결과실행 시간메모리
1357550NewtonabcGarden 3 (JOI26_garden)C++20
100 / 100
2027 ms67936 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
const int M=1e6+10;
const int K=1<<20;
struct uwu{
    vector<ll> s,lz;
    void init(){
        s.resize(K),lz.resize(K);
    }
    void build(int l,int r,int idx){
        s[idx]=0,lz[idx]=0;
        if(l==r) return;
        int m=(l+r)/2;
        build(l,m,idx*2);
        build(m+1,r,idx*2+1);
    }
    void pushlz(int l,int r,int idx){
        if(lz[idx]==0) return;
        s[idx]+=lz[idx];
        if(l!=r) lz[idx*2]+=lz[idx],lz[idx*2+1]+=lz[idx];
        lz[idx]=0;
    }
    void update(int l,int r,int idx,int a,int b,ll val){
        pushlz(l,r,idx);
        if(a>r || b<l) return;
        if(a<=l && b>=r){
            lz[idx]+=val;
            pushlz(l,r,idx);
            return;
        }
        int m=(l+r)/2;
        update(l,m,idx*2,a,b,val);
        update(m+1,r,idx*2+1,a,b,val);
        s[idx]=max(s[idx*2],s[idx*2+1]);
    }
    ll query(int l,int r,int idx,int a,int b){
        pushlz(l,r,idx);
        if(a>r || b<l) return 0;
        if(a<=l && b>=r) return s[idx];
        int m=(l+r)/2;
        return max(query(l,m,idx*2,a,b),query(m+1,r,idx*2+1,a,b));
    }
}T;
ll ta[N],tb[N],tc[N],td[N],ui[N],di[N],li[N],ri[N],wi[N];
int out[N];
int ti,cnt;
vector<tuple<ll,ll,ll,ll,int>> ev;
vector<tuple<ll,ll,ll>> cont[N];
//column, [l,r], +val, time
vector<ll> cr,cc;
int fdr(ll x){return lower_bound(cr.begin(),cr.end(),x)-cr.begin();}
int fdc(ll x){return lower_bound(cc.begin(),cc.end(),x)-cc.begin();}
int main(){
    T.init();
    ll h,w,x; int n; cin>>h >>w >>n >>x;
    for(int i=1;i<=n;i++){
        ll u,d,l,r,w; cin>>u >>d >>l >>r >>w;
        ui[i]=u,di[i]=d,li[i]=l,ri[i]=r,wi[i]=w;
        cr.push_back(u);
        cr.push_back(d);
        cc.push_back(l);
        cc.push_back(r);
    }
    sort(cr.begin(),cr.end());
    sort(cc.begin(),cc.end());
    cr.erase(unique(cr.begin(),cr.end()),cr.end());
    cc.erase(unique(cc.begin(),cc.end()),cc.end());
    int szr=cr.size(),szc=cc.size();
    cnt++;
    int id=0;
    for(int i=1;i<=n;i++){
        ev.push_back({ui[i],li[i],ri[i],wi[i],i});
        ev.push_back({di[i]+1,li[i],ri[i],-wi[i],i});
    }
    sort(ev.begin(),ev.end());
    int ti=n;
    T.build(0,szc-1,1);
    for(int i=0;i<szr;i++){
        while(id<ev.size() && get<0>(ev[id])<=cr[i]){
            auto [u,l,r,w,c]=ev[id++];
            if(out[c]==cnt) continue;
            //cout<<"add" <<l <<" " <<r <<" " <<w <<"\n";
            cont[c].push_back({fdc(l),fdc(r),w});
            T.update(0,szc-1,1,fdc(l),fdc(r),w);
        }
        while(T.query(0,szc-1,1,0,szc-1)>=x && ti){
            ta[ti]=cr[i];
            out[ti]=cnt;
            for(auto [l,r,w]:cont[ti]) T.update(0,szc-1,1,l,r,-w);
            ti--;
        }
        //cout<<cr[i] <<"\n";
        // for(int i=0;i<szc;i++){
        //     cout<<cc[i] <<" ";
        //     cout<<T.query(0,szc-1,1,i,i) <<"\n";
        // }
        if(ti==0) break;
    }
    // for(int i=1;i<=n;i++) cout<<ta[i] <<" ";
    // cout<<"\n";
    for(int i=1;i<=n;i++) cont[i].clear();
    ev.clear();
    for(int i=1;i<=n;i++){
        ev.push_back({ui[i]-1,li[i],ri[i],-wi[i],i});
        ev.push_back({di[i],li[i],ri[i],wi[i],i});
    }
    sort(ev.begin(),ev.end(),greater<tuple<ll,ll,ll,ll,int>>());
    ti=n;
    cnt++;
    id=0;
    T.build(0,szc-1,1);
    for(int i=szr-1;i>=0;i--){
        while(id<ev.size() && get<0>(ev[id])>=cr[i]){
            auto [u,l,r,w,c]=ev[id++];
            if(out[c]==cnt) continue;
            //cout<<c <<" " <<out[c] <<" " <<cnt <<"\n";
            //cout<<"add" <<l <<" " <<r <<" " <<w <<"\n";
            cont[c].push_back({fdc(l),fdc(r),w});
            T.update(0,szc-1,1,fdc(l),fdc(r),w);
        }
        while(T.query(0,szc-1,1,0,szc-1)>=x && ti){
            tb[ti]=cr[i];
            //cout<<"set";
            //cout<<ti <<" " <<cnt <<"\n";
            out[ti]=cnt;
            //cout<<"set";
            //cout<<ti <<" " <<cnt <<"\n";
            //cout<<out[5] <<"\n";
            for(auto [l,r,w]:cont[ti]){
                //cout<<"rem" <<l <<" " <<r <<" " <<w <<"\n";
                T.update(0,szc-1,1,l,r,-w);
            }
            ti--;
        }
        //cout<<"sp" <<out[5] <<"\n";
        //cout<<cr[i] <<"\n";
        // for(int i=0;i<szc;i++){
        //     cout<<cc[i] <<" ";
        //     cout<<T.query(0,szc-1,1,i,i) <<"\n";
        // }
        // cout<<"ck";
        // for(int i=1;i<=n;i++) cout<<out[i] <<" ";
        // cout<<"\n";
        if(ti==0) break;
    }
    // for(int i=1;i<=n;i++){
    //     cout<<ta[i] <<" " <<tb[i] <<"\n";
    // }
    ev.clear(),ti=n,cnt++,id=0;
    cr.clear(),cc.clear();
    for(int i=1;i<=n;i++) cont[i].clear();
    for(int i=1;i<=n;i++) swap(ui[i],li[i]),swap(di[i],ri[i]);
    for(int i=1;i<=n;i++){
        ll u=ui[i],d=di[i],l=li[i],r=ri[i],w=wi[i];
        cr.push_back(u);
        cr.push_back(d);
        cc.push_back(l);
        cc.push_back(r);
    }
    sort(cr.begin(),cr.end());
    sort(cc.begin(),cc.end());
    cr.erase(unique(cr.begin(),cr.end()),cr.end());
    cc.erase(unique(cc.begin(),cc.end()),cc.end());
    szr=cr.size(),szc=cc.size();
    cnt++;
    id=0;
    for(int i=1;i<=n;i++){
        ev.push_back({ui[i],li[i],ri[i],wi[i],i});
        ev.push_back({di[i]+1,li[i],ri[i],-wi[i],i});
    }
    sort(ev.begin(),ev.end());
    ti=n;
    T.build(0,szc-1,1);
    for(int i=0;i<szr;i++){
        while(id<ev.size() && get<0>(ev[id])<=cr[i]){
            auto [u,l,r,w,c]=ev[id++];
            if(out[c]==cnt) continue;
            cont[c].push_back({fdc(l),fdc(r),w});
            T.update(0,szc-1,1,fdc(l),fdc(r),w);
        }
        while(T.query(0,szc-1,1,0,szc-1)>=x && ti){
            tc[ti]=cr[i];
            out[ti]=cnt;
            for(auto [l,r,w]:cont[ti]) T.update(0,szc-1,1,l,r,-w);
            ti--;
        }
        if(ti==0) break;
    }
    for(int i=1;i<=n;i++) cont[i].clear();
    ev.clear();
    for(int i=1;i<=n;i++){
        ev.push_back({ui[i]-1,li[i],ri[i],-wi[i],i});
        ev.push_back({di[i],li[i],ri[i],wi[i],i});
    }
    sort(ev.begin(),ev.end(),greater<tuple<ll,ll,ll,ll,int>>());
    ti=n;
    cnt++;
    id=0;
    T.build(0,szc-1,1);
    for(int i=szr-1;i>=0;i--){
        while(id<ev.size() && get<0>(ev[id])>=cr[i]){
            auto [u,l,r,w,c]=ev[id++];
            if(out[c]==cnt) continue;
            cont[c].push_back({fdc(l),fdc(r),w});
            T.update(0,szc-1,1,fdc(l),fdc(r),w);
        }
        while(T.query(0,szc-1,1,0,szc-1)>=x && ti){
            td[ti]=cr[i];
            out[ti]=cnt;
            for(auto [l,r,w]:cont[ti]){
                T.update(0,szc-1,1,l,r,-w);
            }
            ti--;
        }
        if(ti==0) break;
    }
    // for(int i=1;i<=n;i++){
    //     cout<<ta[i] <<" " <<tb[i] <a<" " <<tc[i] <<" " <<td[i] <<"\n";
    // }
    for(int i=1;i<=n;i++){
        if(ta[i]==0 || tb[i]==0 || tc[i]==0 || td[i]==0) cout<<0 <<"\n";
        else cout<<(tb[i]-ta[i]+1LL)*(td[i]-tc[i]+1LL) <<"\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...