Submission #1352194

#TimeUsernameProblemLanguageResultExecution timeMemory
1352194kiensosadGrowing Trees (BOI11_grow)C++20
100 / 100
103 ms3212 KiB
/*https://oj.uz/problem/view/BOI11_grow*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100000;
int st[4*N+2];
int lazy[4*N+2];
int a[N+2];
int n,q;
void push(int id){
    int &t=lazy[id];
    st[id*2]+=t;
    st[id*2+1]+=t;
    lazy[id*2]+=t;
    lazy[id*2+1]+=t;
    t=0;
}
void update(int id,int l,int r,int u,int v,int x){
    if(l>v||r<u) return;
    if(l>=u&&r<=v){
        st[id]+=x;
        lazy[id]+=x;
        return;
    }
    push(id);
    int mid=(l+r)/2;
    update(id*2,l,mid,u,v,x);
    update(id*2+1,mid+1,r,u,v,x);
    st[id]=max(st[id*2],st[id*2+1]);
}
int get(int id,int l,int r,int x){
    if(l>x||r<x) return -1;
    if(l==r){
        return st[id];
    }
    push(id);
    int mid=(l+r)/2;
    return max(get(id*2,l,mid,x),get(id*2+1,mid+1,r,x));
}
//upperbound
int jump1(int id,int l,int r,int x){
    if(st[id]<=x) return n+1;
    if(l==r){
        return l;
    }
    push(id);
    int mid=(l+r)/2;
    int res=jump1(id*2,l,mid,x);
    if(res!=n+1) return res;
    return jump1(id*2+1,mid+1,r,x);
}
//lowerbound
int jump2(int id,int l,int r,int x){
    if(st[id]<x) return n+1;
    if(l==r){
        return l;
    }
    push(id);
    int mid=(l+r)/2;
    int res=jump2(id*2,l,mid,x);
    if(res!=n+1) return res;
    return jump2(id*2+1,mid+1,r,x);
}
int main(){
    #define task ""
    if(fopen(task ".inp", "r")){
        freopen(task ".inp", "r", stdin);
        freopen(task ".out", "w", stdout);
    }
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++){
        update(1,1,n,i,i,a[i]);
    }
    while(q--){
        char t;
        cin>>t;
        if(t=='F'){
            int c,h;
            cin>>c>>h;
            int p=jump2(1,1,n,h);
            if(p+c-1>=n) update(1,1,n,p,n,1);
            else{
                int x=get(1,1,n,p+c-1);
                int p2=jump2(1,1,n,x);
                update(1,1,n,p,p2-1,1);
                int len=c-(p2-p);
                p2=jump1(1,1,n,x);
                update(1,1,n,p2-len,p2-1,1);
            }
        }
        if(t=='C'){
            int mx,mn;
            cin>>mn>>mx;
            int l=jump2(1,1,n,mn),r=jump1(1,1,n,mx);
            cout<<r-l<<'\n';    
        }
    }
    return 0;
}

Compilation message (stderr)

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