QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#165791 | #6733. Moniphant Sleep | ucup-team1209 | TL | 985ms | 81952kb | C++14 | 3.9kb | 2023-09-05 21:46:05 | 2023-09-05 22:11:33 |
Judging History
answer
#include <bits/stdc++.h>
#define cs const
#define pb push_back
using namespace std;
cs int oo = 1e9 + 7;
cs int N = 5e5 + 5;
int n, q;
int fix(int x) {
if(x >= oo - 5) return oo;
return x;
}
struct func {
int v1, p, v2, vi;
func (int v1 = 0, int p = -1, int v2 = -1, int vi = oo)
: v1(v1), p(p), v2(v2), vi(vi) {}
int operator () (cs int &x) {
if(x == oo) return vi;
if(x <= p) return v1;
return fix(v2 + x - p);
}
void fit () {
if(v1 < 0) {
v1 = oo;
}
if(v2 < -1) {
p -= v2 + 1;
v2 = -1;
}
if(vi < 0) {
vi = oo;
}
v1 = fix(v1);
v2 = fix(v2);
vi = fix(vi);
p = fix(p);
}
void trans() {
if(v1 == oo) v1 = 0;
if(vi == oo) vi = 0;
}
};
func operator + (cs func &a, cs func &b) {
if(a.p == oo && b.p == oo)
return func(fix(a.v1 + b.v1), oo, 0, fix(a.vi + b.vi));
if(a.p == oo)
return func(fix(a.v1 + b.v1), b.p, fix(a.v1 + b.v2), fix(a.vi + b.vi));
if(b.p == oo)
return func(fix(a.v1 + b.v1), a.p, fix(a.v2 + b.v1), fix(a.vi + b.vi));
assert(0);
}
func F(func a, func b) {
func c;
if(a.p == oo) {
c = func (a.v1, oo, 0, a(b.vi));
// for(int i = 0; i <= 10; i++)
// assert(c(i) == a(b(i)));
// assert(c(oo) == a(b(oo)));
c.fit();
return c;
}
if(b.p == oo) {
c = func (a(b.v1), oo, 0, a(b.vi));
// for(int i = 0; i <= 10; i++)
// assert(c(i) == a(b(i)));
// assert(c(oo) == a(b(oo)));
c.fit();
return c;
}
c.vi = a(b.vi);
c.p = b.p;
c.v1 = a(b.v1);
if(a.p > b.v2) {
c.p += a.p - b.v2;
c.v1 = a.v1;
}
c.v2 = a(b(c.p + 1)) - 1;
// for(int i = 0; i <= 10; i++)
// assert(c(i) == a(b(i)));
// assert(c(oo) == a(b(oo)));
c.fit();
return c;
}
func flat (func x) {
if(x.v1 == oo) x.v1 = 0;
if(x.vi == oo) x.vi = 0;
return x;
}
struct skip {
func a, c;
int d;
bool add;
skip (func a = func(0, oo, 0, 0), func c = func(0, -1, -1, oo), int d = 0, bool add = 0)
: a(a), c(c), d(d), add(add) {}
void operator += (cs skip &x) {
if(x.add) {
a = a + flat (F(x.a, c));
add = 1;
}
d += x.d;
c = F(x.c, c);
}
};
#define mid ((l + r) >> 1)
skip t[N << 2];
skip a[4] = {
skip(func(0, oo, 0, 0), func(0, -1, 0, oo), 1, 0),
skip(func(0, oo, 0, 0), func(oo, 0, -1, oo), -1, 0),
skip(func(0, oo, 0, 0), func(0, -1, -1, 0), 0, 0),
skip(func(0, -1, -1, 0), func(oo, oo, 0, oo), 0, 1)
};
void pbpb(skip & c, int op) {
c += a[op - 1];
}
void put(int x, skip c) {
t[x] += c;
}
void down(int x) {
put(x << 1, t[x]);
put(x << 1 | 1, t[x]);
t[x] = skip();
}
void modify (int x, int l, int r, int L, int R, int op) {
if(L <= l && r <= R) {
pbpb(t[x], op);
return;
}
down(x);
if(L <= mid) modify(x << 1, l, mid, L, R, op);
if(R > mid) modify(x << 1 | 1, mid + 1, r, L, R, op);
}
int query(int x, int l, int r, int p) {
if(l == r) {
return t[x].d - t[x].a(oo);
}
down(x);
if(p <= mid) return query(x << 1, l, mid, p);
return query(x << 1 | 1, mid + 1, r, p);
}
#undef mid
int main() {
#ifdef zqj
freopen("1.in","r",stdin);
#endif
cin >> n >> q;
for(int z = 0; z < q; z++) {
int op, l, r;
scanf("%d%d%d", &op, &l, &r);
if(op <= 4) {
modify(1, 1, n, l, r, op);
}
if(op == 5) {
cout << query(1, 1, n, l) + 500000 << '\n';
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 3ms
memory: 81952kb
input:
1 9 1 1 1 1 1 1 1 1 1 3 1 1 2 1 1 1 1 1 1 1 1 4 1 1 5 1 1
output:
500004
result:
ok 1 number(s): "500004"
Test #2:
score: 0
Accepted
time: 3ms
memory: 81884kb
input:
3 7 2 1 3 3 1 3 1 1 3 1 1 3 5 1 1 4 1 3 5 1 1
output:
500001 499999
result:
ok 2 number(s): "500001 499999"
Test #3:
score: 0
Accepted
time: 985ms
memory: 81848kb
input:
500000 500000 2 132991 371170 5 15281 15281 1 278642 397098 2 152103 176573 2 13797 47775 3 139320 370045 3 79054 432340 3 82556 212775 4 270171 469418 5 148000 148000 3 371255 401414 5 71051 71051 2 358945 473071 2 231663 265401 2 20243 58131 1 247710 313373 5 154549 154549 1 17317 233265 5 37602 3...
output:
500000 499999 500000 499998 499999 500000 500000 499997 500000 499997 499997 499999 499998 500000 499997 500000 499999 500001 499999 499999 499997 499997 499996 499998 500000 500001 500001 499996 499998 499999 499996 499999 500001 500000 500000 500002 500002 499997 500001 499997 499995 499999 500004...
result:
ok 99850 numbers
Test #4:
score: -100
Time Limit Exceeded
input:
500000 500000 1 82261 414004 4 128531 435780 1 182288 357334 1 384377 425512 5 400207 400207 5 12158 12158 4 287819 439382 4 273623 387675 4 141825 285941 3 69773 134995 4 29380 264126 1 294648 422834 5 39538 39538 3 142540 417717 5 234932 234932 3 203802 448531 4 70427 154922 5 350852 350852 1 1512...
output:
500002 500000 500000 500002 500003 500000 499998 499999 500000 500001 499998 499996 500001 499997 499995 499998 499995 499996 499994 499998 499999 500000 499996 499988 499995 499999 499992 500001 499995 499991 499991 499995 500002 499987 499992 500000 500001 499988 499987 499989 499989 499992 500001...