Cod sursa(job #2290866)

Utilizator Liviu_Ionut_MoantaMoanta Ionut Liviu Liviu_Ionut_Moanta Data 27 noiembrie 2018 09:23:10
Problema Xerox Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <bits/stdc++.h>
using namespace std;

struct Node {
    uint64_t mnm:18, lef:23, rig:23; } sgt[8000055];
pair<int, int> arr[200005]; int rot[200005], nrt;

int minSon(int nd, int le, int ri) {
    if (!sgt[nd].lef or !sgt[nd].rig) {
        return 0; }
    else {
        return min(sgt[sgt[nd].lef].mnm, sgt[sgt[nd].rig].mnm); } }

int update(int ls, int le, int ri, int st, int en) {
    if (ri < st or en < le) {
        return ls; }
    int nw = ++nrt; sgt[nw] = sgt[ls];
    if (st <= le and ri <= en) {
        ++sgt[nw].mnm; }
    else {
        int md = (le + ri) / 2,
            aux = sgt[nw].mnm - minSon(nw, le, ri);
        if (st <= md) {
            sgt[nw].lef = update(sgt[nw].lef, le, md, st, en); }
        if (md <  en) {
            sgt[nw].rig = update(sgt[nw].rig, md + 1, ri, st, en); }
        sgt[nw].mnm = minSon(nw, le, ri) + aux; }
    return nw; }

int query(int nd, int le, int ri, int st, int en) {
    if (ri < st or en < le) {
        return 1000000000; }
    if (nd == 0) {
        return 0; }
    if (st <= le and ri <= en) {
        return sgt[nd].mnm; }
    else {
        int md = (le + ri) / 2,
            aux = sgt[nd].mnm - minSon(nd, le, ri);
        return aux + min(query(sgt[nd].lef, le, md, st, en),
                         query(sgt[nd].rig, md + 1, ri, st, en)); } }

int main(void) {
 //   freopen("test.in", "r", stdin);
 //   freopen("test.out", "w", stdout);
    int n, m; cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> arr[i].first; arr[i].second = i; }
    sort(arr + 1, arr + n + 1);
    for (int i = 1; i <= n; ++i) {
        rot[i] = update(rot[i - 1], 1, n - m + 1,
            max(1, arr[i].second - m + 1), min(n - m + 1, arr[i].second)); }
    int q, ans = 0; cin >> q;
    while (q--) {
        int l, r, p; cin >> l >> r >> p; p ^= ans;
        int pos = lower_bound(arr + 1, arr + n + 1, make_pair(p, 0)) - arr;
        cout << (ans = query(rot[pos - 1], 1, n - m + 1, l, r)) << "\n"; }
    return 0; }