Submission #1263826

#TimeUsernameProblemLanguageResultExecution timeMemory
1263826minhpk푸드 코트 (JOI21_foodcourt)C++20
100 / 100
276 ms105976 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b,t;
int z[1000005];
vector<pair<int,int>> del[1000005],add[1000005],q[1000005];
struct node{
     int val,min1;
};
struct st{
      node f[4000005];
      void build(){
           for (int i=1;i<=4*t;i++){
                f[i]={0,0};
           }
      }
      void update(int id,int l,int r,int pos,int val){
           if (l==r){
              f[id].val=val;
              f[id].min1=min(0LL,val);
              return;
           }
           int mid=(l+r)/2;
           if (pos<=mid){
               update(id*2,l,mid,pos,val);
           }else{
               update(id*2+1,mid+1,r,pos,val);
           }
           f[id].val=f[id*2].val+f[id*2+1].val;
           f[id].min1=min(f[id*2].min1,f[id*2].val+f[id*2+1].min1);
      }
      node get(int id,int l,int r,int x,int y){
          if (x>r || y<l){
              return {0,0};
          }
          if (l>=x && y>=r){
              return f[id];
          }
          int mid=(l+r)/2;
          node pre=get(id*2,l,mid,x,y);
          node pre1=get(id*2+1,mid+1,r,x,y);
          return {pre.val+pre1.val,min(pre.min1,pre.val+pre1.min1)};
      }
      int get(int id,int l,int r,int val){
          if (l==r){
              return l;
          }
          int mid=(l+r)/2;
          if (val<=f[id*2].val){
              return get(id*2,l,mid,val);
          }else{
              return get(id*2+1,mid+1,r,val-f[id*2].val);
          }
      }
};
st f,f1;
vector <pair<int,int>> ans;
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a >> b >> t;
    for (int i=1;i<=t;i++){
         int c;
         cin >> c;
         if (c==1){
             int l,r,k;
             cin >> l >> r >> z[i] >> k;
             add[l].push_back({i,k});
             add[r+1].push_back({i,0});

         }else if (c==2){
             int l,r,k;
             cin >> l >> r >> k;
             del[l].push_back({i,-k});
             del[r+1].push_back({i,0});
         }else{
             int x,y;
             cin >> x >> y;
             q[x].push_back({i,y});
         }
    }
    for (int i=1;i<=a;i++){
         for (auto p:add[i]){
              f.update(1,1,t,p.first,p.second);
              f1.update(1,1,t,p.first,p.second);
         }
         for (auto p:del[i]){
              f.update(1,1,t,p.first,p.second);
         }
         for (auto p:q[i]){
              node pre=f.get(1,1,t,1,p.first);
              node pre1=f1.get(1,1,t,1,p.first);
              int pos=pre1.val-pre.val+pre.min1+p.second;
              if (pos>pre1.val){
                  ans.push_back({p.first,0});
              }else{
                  int col=z[f1.get(1,1,t,pos)];
                  ans.push_back({p.first,col});
              }
         }
    }
    sort(ans.begin(),ans.end());
    for (auto p:ans){
         cout << p.second << "\n";
    }
    return 0;
}
#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...