제출 #1369861

#제출 시각아이디문제언어결과실행 시간메모리
1369861eyadoozTornjevi (COCI25_tornjevi)C++20
110 / 110
125 ms20332 KiB
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

#define pb push_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int) (x).size()
#define endl '\n'

const int N=(1ll<<20);
vector<int> tree[4*N];
int cnt=0;
int query(int l, int r, int ql, int qr, int v) {
    if(l>qr||r<ql) return 0;
    if(ql<=l&&r<=qr) return lower_bound(all(tree[v]), cnt)-tree[v].begin();
    int mid=(l+r)/2;
    return query(l, mid, ql, qr, 2*v)+query(mid+1, r, ql, qr, 2*v+1);
}
int main()
{
    cin.tie(0) -> sync_with_stdio(0);

    int n, q;
    cin >> n >> q;
    string ca;
    cin >> ca;
    bool a[n];
    vector<int> s[4];
    int nxt[n+1]={};
    for(int i = 0;i <= n;i++) nxt[i]=-1;
    for(int i = 0;i < n;i++) 
    {
        a[i]=(ca[i]=='P');
        s[a[i]].pb(i);
        if(sz(s[a[i]^1])) nxt[i]=s[a[i]^1].back(), s[a[i]^1].pop_back(); 
        tree[i+N].pb(nxt[i]);
    }
    for(int i=N-1;i>=1;i--) {    
        merge(all(tree[2*i]), all(tree[2*i+1]), back_inserter(tree[i]));
    }
    vector<array<int, 3>> quer;
    for(int i=0;i<q;i++) {
        int l, r;
        cin >> l >> r;
        l--, r--;
        cnt=l;
        int ans=query(0, N-1, l, r, 1);
        // for(int i=l;i<=r;i++) ans=query(0, N-1, l, i, 1); 
            cout << ans << endl;
    }
    // for(int i = 2;i < n;i++) cout << nxt[i] << " ";
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…