Submission #1272616

#TimeUsernameProblemLanguageResultExecution timeMemory
1272616minhpkMatryoshka (JOI16_matryoshka)C++20
100 / 100
509 ms63336 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,c;
pair<int,int> z[1000005];
vector <int> v;
vector <int> v1;
vector <int> pos[1000005];
vector <pair<int,int>> pos1[1000005];
pair<int,int> q[1000005];
pair<int,int> f[4000005];
int inf=1e16;
int res[1000005];
void build(int id,int l,int r){
    if (l==r){
        f[id]={inf,0};
        return;
    }
    int mid=(l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    f[id].first=min(f[id*2].first,f[id*2+1].first);
    f[id].second=f[id*2].second+f[id*2+1].second;
}
void update(int id,int l,int r,int pos,int val){
    if (l==r){
        f[id].second+=val;
        if (f[id].second==1){
             f[id].first=l;
        }
        if (f[id].second==0){
             f[id].first=inf;
        }
        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].first=min(f[id*2].first,f[id*2+1].first);
    f[id].second=f[id*2].second+f[id*2+1].second;
}
int get(int id,int l,int r,int x,int y){
    if (x>r || y<l){
        return inf;
    }
    if (l>=x && y>=r){
        return f[id].first;
    }
    int mid=(l+r)/2;
    return min(get(id*2,l,mid,x,y),get(id*2+1,mid+1,r,x,y));
}
int get1(int id,int l,int r,int x,int y){
    if (x>r || y<l){
        return 0;
    }
    if (l>=x && y>=r){
        return f[id].second;
    }
    int mid=(l+r)/2;
    return get1(id*2,l,mid,x,y)+get1(id*2+1,mid+1,r,x,y);
}
signed main()
{
    if (fopen("bb.inp","r")){
        freopen("bb.inp","r",stdin);
        freopen("bb.out","w",stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a >> c;   
    for (int i=1;i<=a;i++){
         cin >> z[i].first >> z[i].second;
         v.push_back(z[i].first);
         v1.push_back(z[i].second);
    }
    
    for (int i=1;i<=c;i++){
         cin >> q[i].first >> q[i].second;
         v.push_back(q[i].first);
         v1.push_back(q[i].second);
    }
    sort(v.begin(),v.end());
    sort(v1.begin(),v1.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    v1.erase(unique(v1.begin(),v1.end()),v1.end());

    for (int i=1;i<=a;i++){
         z[i].first=lower_bound(v.begin(),v.end(),z[i].first)-v.begin()+1;
         z[i].second=lower_bound(v1.begin(),v1.end(),z[i].second)-v1.begin()+1;
         pos[z[i].first].push_back(z[i].second);
    }
    for (int i=1;i<=c;i++){
         q[i].first=lower_bound(v.begin(),v.end(),q[i].first)-v.begin()+1;
         q[i].second=lower_bound(v1.begin(),v1.end(),q[i].second)-v1.begin()+1;
         pos1[q[i].first].push_back({q[i].second,i});
    }
    int n=v.size();
    int n1=v1.size();
    build(1,1,n1);
    for (int i=n;i>=1;i--){
         vector <int> add;
         for (auto p:pos[i]){
              int val=get(1,1,n1,p+1,n1);
              add.push_back(p);
              if (val!=inf){
                  update(1,1,n1,val,-1);
              }
         }
         for (auto p:add){
              update(1,1,n1,p,1);
         }
         for (auto p:pos1[i]){
              res[p.second]=get1(1,1,n1,1,p.first);
         }
    }
    for (int i=1;i<=c;i++){
         cout << res[i] << "\n";
    }
    return 0;
}

Compilation message (stderr)

matryoshka.cpp: In function 'int main()':
matryoshka.cpp:68:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |         freopen("bb.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
matryoshka.cpp:69:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |         freopen("bb.out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...