답안 #377901

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
377901 2021-03-15T13:26:08 Z Vimmer Specijacija (COCI20_specijacija) C++14
10 / 110
1531 ms 138328 KB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-O3")
#pragma GCC optimize("Ofast")

#define N 200051
#define NN 1005000
#define PB push_back
#define M ll(1e9 + 7)
#define all(x) x.begin(), x.end()
#define sz(x) int(x.size())
#define pri(x) cout << x << endl
#define endl '\n'
#define _ << " " <<
#define F first
#define S second

using namespace std;
//using namespace __gnu_pbds;

typedef long long ll;
//typedef tree <ll, null_type, less_equal <ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

typedef long double ld;
typedef unsigned long long ull;
typedef short int si;

struct node
{
    int sum = 0;

    node *l, *r;

    node(): sum(1), l(nullptr), r(nullptr) {}
    node(int sm): sum(sm), l(nullptr), r(nullptr) {}

    node(node *lt, node *rt): l(lt), r(rt), sum(lt->sum + rt->sum) {}
};

vector <node*> vr;

int tt[N * 4];

node* bld(int tl, int tr)
{
    if (tl == tr) return new node();
    else
    {
        int md = (tl + tr) >> 1;

        return new node(bld(tl, md), bld(md + 1, tr));
    }
}

node* upd(node *v, int tl, int tr, int ps)
{
    if (tl == tr)
    {
        return new node(0);
    }

    int md = (tl + tr) >> 1;

    if (v ->l->sum >= ps)
    {
        return new node(upd(v->l, tl, md, ps), v->r);
    }
    else
    {
        return new node(v->l, upd(v->r, md + 1, tr, ps - v->l->sum));
    }
}

int get(node *v, int tl, int tr, int l, int r)
{
    if (tr < l || r < tl) return 0;

    if (l <= tl && tr <= r)
        return v->sum;

    int md = (tl + tr) >> 1;

    return get(v->l, tl, md, l, r) + get(v->r, md + 1, tr, l, r);
}

int opr(node *v, int tl, int tr, int ps)
{
    if (tl == tr)
        return tl;

    int md = (tl + tr) >> 1;

    if (v->l->sum >= ps)
        return opr(v->l, tl, md, ps);

    return opr(v->r, md + 1, tr, ps - v->l->sum);
}

int n, q, t;
ll a[N];

ll lft(int i) {return 1ll * i * (i - 1) / 2;}

vector <ll> vt;


void upd(int v, int tl, int tr, int ps, int val)
{
    if (tl == tr)
    {
        tt[v] = val;

        return;
    }

    int md = (tl + tr) >> 1;

    if (ps <= md)
        upd(v + v, tl, md, ps, val);
            else upd(v + v + 1, md + 1, tr, ps, val);

    tt[v] = min(tt[v + v], tt[v + v + 1]);
}

int get(int v, int tl, int tr, int l, int r)
{
    if (tr < l || r < tl) return 1e9;

    if (l <= tl && tr <= r)
        return tt[v];

    int md = (tl + tr) >> 1;

    return min(get(v + v, tl, md, l, r), get(v + v + 1, md + 1, tr, l, r));
}


ll ans(ll x, ll y)
{
    if (x == y)
        return x;

    int l = upper_bound(all(vt), x) - 1 - vt.begin();
    int r = upper_bound(all(vt), y) - 1 - vt.begin();

    l++; r++;

    ll xr = x, yr = y;

    x -= lft(l);

    y -= lft(r);

    x = opr(vr[n + 1 - l], 1, n + 1, x);

    y = opr(vr[n + 1 - r], 1, n + 1, y);

    if (x == y)
        return min(xr, yr);

    if (x > y)
        swap(x, y);

    int lt = get(1, 1, n + 1, x, y);

    if (lt == l)
        return xr;

    if (lt == r)
        return yr;

    return a[lt];
}

int main()
{
    ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0);

//    freopen("1.in", "r", stdin);

    for (int i = 0; i < N * 4; i++)
        tt[i] = 1e9;

    cin >> n >> q >> t;

    ll m = (1ll * (n + 1) * (n + 2)) / 2;

    vr.PB(bld(1, n + 1));

    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];

        vt.PB(lft(i) + 1);
    }

    for (int i = n; i >= 1; i--)
    {
        int l = a[i] - lft(i);

        int p = opr(vr.back(), 1, n + 1, l);

        vr.PB(upd(vr.back(), 1, n + 1, l));

        upd(1, 1, n + 1, p, i);
    }

    vt.PB(lft(n + 1) + 1);

    ll lst = 0;

    for (; q > 0; q--)
    {
        ll x, y;

        cin >> x >> y;

        x = (x - 1 + t * lst) % m + 1;

        y = (y - 1 + t * lst) % m + 1;

        lst = ans(x, y);

        pri(lst);
    }
}

Compilation message

Main.cpp: In constructor 'node::node(node*, node*)':
Main.cpp:35:15: warning: 'node::r' will be initialized after [-Wreorder]
   35 |     node *l, *r;
      |               ^
Main.cpp:33:9: warning:   'int node::sum' [-Wreorder]
   33 |     int sum = 0;
      |         ^~~
Main.cpp:40:5: warning:   when initialized here [-Wreorder]
   40 |     node(node *lt, node *rt): l(lt), r(rt), sum(lt->sum + rt->sum) {}
      |     ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 494 ms 137820 KB Output is correct
2 Correct 30 ms 13416 KB Output is correct
3 Correct 558 ms 137948 KB Output is correct
4 Correct 248 ms 73824 KB Output is correct
5 Correct 529 ms 137816 KB Output is correct
6 Correct 143 ms 43236 KB Output is correct
7 Correct 294 ms 137820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 494 ms 137820 KB Output is correct
2 Correct 30 ms 13416 KB Output is correct
3 Correct 558 ms 137948 KB Output is correct
4 Correct 248 ms 73824 KB Output is correct
5 Correct 529 ms 137816 KB Output is correct
6 Correct 143 ms 43236 KB Output is correct
7 Correct 294 ms 137820 KB Output is correct
8 Incorrect 180 ms 4460 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 494 ms 137820 KB Output is correct
2 Correct 30 ms 13416 KB Output is correct
3 Correct 558 ms 137948 KB Output is correct
4 Correct 248 ms 73824 KB Output is correct
5 Correct 529 ms 137816 KB Output is correct
6 Correct 143 ms 43236 KB Output is correct
7 Correct 294 ms 137820 KB Output is correct
8 Incorrect 180 ms 4460 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1531 ms 138328 KB Output isn't correct
2 Halted 0 ms 0 KB -