제출 #1343347

#제출 시각아이디문제언어결과실행 시간메모리
1343347coin_Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
0 / 100
3099 ms327680 KiB
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

// count numbers of inversions using st
const int maxn = 1e6 + 5;
struct node{
    int inv;
    vector<int> arr;

    node(int in, vector<int> ar): inv(in), arr(ar) {}
    node(){
        inv = 0;
    }
} st[4*maxn+5];

node comb(const node &a, const node &b){
    // perform merge sort
    int n = a.arr.size(), m = b.arr.size();
    int i = 0, j = 0;
    vector<int> comb;
    int inv = a.inv + b.inv;
    while(i < n && j < m){
        if (a.arr[i] > b.arr[j]){
            // inv exists, j forms inv pair from i to n-1
            inv += n-i;
            comb.push_back(b.arr[j]);
            j++;
        }
        else{
            comb.push_back(a.arr[i]);
            i++;
        }
    }
    while(j < m){
        comb.push_back(b.arr[j]);
        j++;
    }
    while (i < n){
        // inv exists, every m forms inv pair with i
        inv += m;
        comb.push_back(a.arr[i]);
        i++;
    }
    return node(inv, comb);
}

void build(int id, int l, int r, vector<int> &a){
    if (l == r){
        vector<int> tmp(1, a[l]);
        st[id] = node(0, tmp);
        return;
    }
    int mid = (l + r)/2;
    build(id*2, l, mid, a);
    build(id*2+1, mid+1, r, a);
    st[id] = comb(st[id*2], st[id*2+1]);
}

node get(int id, int l, int r, int ul, int ur){
    if (l > ur || r < ul) return node(0, vector<int>());
    if (ul <= l && r <= ur) return st[id];
    int mid = (l + r)/2;
    return comb(get(id*2, l, mid, ul, ur), get(id*2+1, mid+1, r, ul, ur));
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    int n, q;
    cin >> n >> q;
    vector<int> bk(n+1);
    for (int i = 1; i <= n; i++){
        cin >> bk[i];
    }
    build(1, 1, n, bk);
    while(q--){
        int u, v, k;
        cin >> u >> v >> k;
        // for each query determine whether the largest swap >= k or not
        // sub 3, basically checking if subarray is sorted
        int why = get(1, 1, n, u, v).inv;
        if (why == 0){
            cout << 1 << endl;
        }
        else cout << 0 << 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...