제출 #1255311

#제출 시각아이디문제언어결과실행 시간메모리
1255311Mer123haba456Growing Trees (BOI11_grow)C++20
100 / 100
112 ms7940 KiB
#include <bits/stdc++.h>
using namespace std;
#define fast_io ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define N lli(5e6)
#define MOD lli(1e9 + 7)
#define heps(v) v.begin(), v.end()
typedef long long int lli;
typedef vector<lli> vlli;
typedef pair<lli, lli> plli;
typedef vector<plli> vplli;
typedef pair<lli, plli> pplli;
typedef vector<pplli> vpplli;

lli n,m,k,q,t;
vlli vect;

lli seg[N][3];

void yap(lli v, lli l,lli r){
    if(l == r){
        seg[v][1] = vect[r];
        seg[v][2] = vect[r];
        return;
    }
    lli m = (l+r)/2;
    yap(2*v,l,m);
    yap(2*v+1,m+1,r);
    seg[v][1] = max(seg[2*v][1], seg[2*v+1][1]);
    seg[v][2] = min(seg[2*v][2], seg[2*v+1][2]);
}

void gunc(lli v,lli l, lli r, lli istl, lli istr){
    if(istl<=l && r <= istr){
        seg[v][1]++;
        seg[v][0]++;
        seg[v][2]++;
        return;
    }
    lli m = (l+r)/2;
    if(istr<=m)
        gunc(2*v,l,m,istl,istr);
    else if(istl > m)
        gunc(2*v+1,m+1,r,istl,istr);
    else{
        gunc(2*v,l,m,istl,istr);
        gunc(2*v+1,m+1,r,istl,istr);
    }
    seg[v][1] = max(seg[2*v+1][1], seg[2*v][1]) + seg[v][0];
    seg[v][2] = min(seg[2*v+1][2], seg[2*v][2]) + seg[v][0];
}

lli getirBas(lli v,lli l,lli r,lli ist, lli art){
    if(l == r)
        return r;
    lli m = (l+r)/2;
    art += seg[v][0];
    if(seg[2*v][1] + art >= ist)
        return getirBas(2*v,l,m,ist, art);
    else
        return getirBas(2*v+1,m+1,r,ist, art);
}
lli getirSon(lli v,lli l,lli r,lli ist, lli art){
    if(l == r)
        return r;
    lli m = (l+r)/2;
    art += seg[v][0];
    if(ist >= seg[2*v+1][2] + art)
        return getirSon(2*v+1,m+1,r,ist, art);
    else
        return getirSon(2*v, l ,m ,ist, art);
}

lli getir(lli v,lli l,lli r, lli ist){
    if(l == r)
        return seg[v][1];
    lli m = (l+r)/2;
    if(ist<=m)
        return getir(2*v,l,m,ist) + seg[v][0];
    else
        return getir(2*v+1,m+1,r,ist) + seg[v][0];
}

int main()
{
    fast_io
    cin >> n >> q;
    for(lli i = 0;i<n;i++){
        cin >> k;
        vect.push_back(k);
    }
    sort(heps(vect));
    yap(1,0,n-1);
    while(q--){
        char c;
        cin >> c >> k >> m;
        if(c == 'F'){
            lli ind = getirBas(1,0,n-1,m, 0);
            lli say = getir(1,0,n-1,ind);
            if(say < m)
                continue;
            
            lli son = min(n-1, ind + k - 1);
            lli sonsay = getir(1,0,n-1,son);
            lli sonson = getirSon(1,0,n-1,sonsay, 0);
            if(son < sonson){
                lli sonilk = getirBas(1,0,n-1,sonsay, 0);
                lli su = son - sonilk + 1;
                gunc(1,0,n-1,sonson - su + 1,sonson);
                //cout << son << " " << sonsay << " " << sonson - su + 1 << " s" << sonson << endl;
                son = sonilk - 1;
                
            }
            if(ind > son)
                continue;
            //cout << ind << " " << son << endl;
            gunc(1,0,n-1,ind,son);
        }else{
            lli so = getirBas(1,0,n-1,k, 0);
            lli sosay = getir(1,0,n-1,n-1);
            if(k > sosay){
                cout << "0" << endl;
                continue;
            }
            
            lli sag = getirSon(1,0,n-1,m, 0);
            lli sagsay = getir(1,0,n-1,0);
            //cout << so << " " << sosay << " " << sag << " " << sagsay << endl;
            if(m < sagsay){
                cout << "0" << endl;
                continue;
            }
            cout << sag - so + 1 << endl;
        }
    }
}
#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...