Submission #571891

#TimeUsernameProblemLanguageResultExecution timeMemory
571891dantoh000Food Court (JOI21_foodcourt)C++14
100 / 100
610 ms74060 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> ii;
int n,m,q;
struct dat{
    int v, pv, id;
};

dat merge(dat a, dat b){
    dat D;
    D.id = (a.pv + b.v > b.pv)?a.id:b.id;
    D.v = a.v + b.v;
    D.pv = max(a.pv + b.v, b.pv);
    return D;
}
struct node{
    int s,e,m;
    dat D;
    int NV;
    node *l, *r;
    node (int _s, int _e){
        s = _s, e = _e, m = (s+e)/2;
        D.v = D.pv = NV = 0;
        D.id = e;
        if (s != e){
            l = new node(s, m);
            r = new node(m+1, e);
        }
    }
    void up(int x, int nv){
        if (s == e){
            D.v = nv;
            D.pv = nv;
            NV = max(0ll, nv);
            return;
        }
        if (x > m) r->up(x,nv);
        else l->up(x,nv);
        D = merge(l->D, r->D);
        NV = l->NV + r->NV;
    }
    int sum(int qs, int qe){
        if (qs == s && qe == e){
            return NV;
        }
        else if (qs > m) return r->sum(qs, qe);
        else if (qe <= m) return l->sum(qs, qe);
        else{
            return l->sum(qs,m) + r->sum(m+1,qe);
        }
    }
    int find(int X){
        if (s == e) return s;
        if (l->NV >= X) return l->find(X);
        else return r->find(X-l->NV);
    }
    dat findMaxSuffix(int qs, int qe){
        ///printf("%d %d:  %d %d\n",s,e,qs,qe);
        if (qs == s && qe == e){
            return D;
        }
        else if (qs > m) return r->findMaxSuffix(qs, qe);
        else if (qe <= m) return l->findMaxSuffix(qs, qe);
        else{
            dat L = l->findMaxSuffix(qs, m);
            dat R = r->findMaxSuffix(m+1,qe);
            return merge(L, R);
        }
    }
} *root;
int ID[250005];
int ANS[250005];
vector<ii> ups[250005];
vector<ii> qus[250005];
main(){
    scanf("%lld%lld%lld",&n,&m,&q);
    for (int i = 0; i < q; i++){
        int t;
        scanf("%lld",&t);
        if (t == 1){
            int l,r,c,k;
            scanf("%lld%lld%lld%lld",&l,&r,&c,&k);
            ID[i] = c;
            ups[l].push_back({i,k});
            ups[r+1].push_back({i,0});
        }
        else if (t == 2){
            int l,r,k;
            scanf("%lld%lld%lld",&l,&r,&k);
            ups[l].push_back({i,-k});
            ups[r+1].push_back({i,0});
        }
        else{
            int a,b;
            scanf("%lld%lld",&a,&b);
            qus[a].push_back({b,i});
        }
    }
    fill(ANS, ANS+q, -1);
    root = new node(0, q+1);
    for (int i = 1; i <= n; i++){
        //printf("at store %d\n",i);
        for (auto [id, nv] : ups[i]){
            //printf("updating %d to %d\n",id,nv);
            root->up(id, nv);
        }
        for (auto [qv, id]: qus[i]){
            //printf("at store %d, querying for the maxsuffix ending at %d\n",i,id);
            dat res = root->findMaxSuffix(0, id);
            //printf("answer %d %d %d\n",res.v, res.pv, res.id);
            if (res.pv < qv){
                ANS[id] = 0;
                continue;
            }
            int target = res.pv - qv;
            //printf("targeting suffix of %d\n",target);
            int PF = root->sum(0, id);
            //printf("sum  is %d, need to find first prefix that is >= %d\n",PF,PF-target);
            int ret = root->find(PF - target);
            //printf("found at %d\n",ret);
            ANS[id] = ID[ret];

        }
    }
    for (int i = 0; i < q; i++){
        if (ANS[i] != -1) printf("%lld\n",ANS[i]);
    }
}

Compilation message (stderr)

foodcourt.cpp:76:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   76 | main(){
      | ^~~~
foodcourt.cpp: In function 'int main()':
foodcourt.cpp:104:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  104 |         for (auto [id, nv] : ups[i]){
      |                   ^
foodcourt.cpp:108:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  108 |         for (auto [qv, id]: qus[i]){
      |                   ^
foodcourt.cpp:77:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |     scanf("%lld%lld%lld",&n,&m,&q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:80:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |         scanf("%lld",&t);
      |         ~~~~~^~~~~~~~~~~
foodcourt.cpp:83:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |             scanf("%lld%lld%lld%lld",&l,&r,&c,&k);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:90:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   90 |             scanf("%lld%lld%lld",&l,&r,&k);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:96:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   96 |             scanf("%lld%lld",&a,&b);
      |             ~~~~~^~~~~~~~~~~~~~~~~~
#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...