QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#234877 | #4429. Gebyte's Grind | raulandreipop | RE | 0ms | 0kb | C++11 | 5.4kb | 2023-11-02 00:48:30 | 2023-11-02 00:48:31 |
answer
#include <iostream>
#include <vector>
using namespace std;
using ll = long long;
const int NMAX = 2e6;
const ll INF = 1e18 + 5;
struct function {
ll a, b, y;
ll eval (ll x)
{
if (x <= a) return 0;
else if (a < x && x <= b) return y;
else return x-b+y;
}
function o (function f2)
{
ll new_a , new_b , new_y;
if (a < f2.y) {
new_a = f2.a;
}
else if (a == f2.y)
{
new_a = f2.b;
}
else {
new_a = a + f2.b - f2.y;
}
new_y = y;
if (b < f2.y) {
new_b = f2.b;
new_y = f2.y - b + y;
}
else if (b == f2.y)
{
new_b = f2.b;
}
else {
new_b = f2.y - f2.b - b;
}
return {new_a , new_b , new_y};
}
static function identity(){
function ret;
ret = {0,0,0};
return ret;
}
} initial[NMAX+1] ;
template<typename data>
struct AINT {
vector<data> aint;
int n, offset;
int nextPowerOf2 (int n)
{
int ret = 1;
while (ret * 2 <= n) ret *= 2;
return ret;
}
AINT (int _n)
{
n = _n;
offset = nextPowerOf2 (n);
aint.resize(2*offset + 1, data::identity());
for (int i = offset; i < 2 * offset; i++)
{
if (i-offset+1 <= n) {
aint[i] = initial[i-offset+1];
}
}
for (int i = offset-1; i > 0; i--)
{
aint[i] = merge(aint[2*i] , aint[2*i+1]);
}
}
void update (int pos , data f)
{
upd (1 , 1 , offset , pos , f);
}
int CB (int pos , ll h)
{
int nod = pos + offset-1;
data func = aint[nod];
if (func.eval(h) == 0) return -1;
data prev = func;
while (func.eval(h) > 0)
{
// cout << " " << nod << ' ';
// cout << func.eval(h) << '\n';
prev = func;
if ((nod & 1) && !(nod & (nod+1))){
return n;
}
else if (nod % 2 == 1)
{
nod = nod/2 + 1;
func = aint[nod].o(func);
}
else {
nod /= 2;
func = aint[nod];
prev = data::identity();
}
}
func = prev;
// cout << func.a << ' ' << func.b << ' ' << func.y << '\n';
// cout << " " << nod <<'\n';
while (nod < offset)
{
data new_func = aint[2 * nod].o(func);
if (new_func.eval(h) > 0)
{
func = new_func;
nod = 2 * nod + 1;
}
else {
nod = 2 * nod;
}
// cout << nod << '\n';
}
return nod-offset;
}
void upd (int nod , int l , int r , int pos , data f)
{
if (l == r)
{
if (l == pos) aint[nod] = f;
return;
}
else if (pos < l || r < pos) return;
int mid = (l + r) / 2;
upd(2 * nod , l , mid , pos , f);
upd(2*nod+1, mid+1 , r, pos , f);
aint[nod] = merge(aint[2*nod] , aint[2*nod+1]);
return;
}
data qry (int nod , int l , int r , int ql , int qr)
{
if (qr < l || r < ql) return data::identity();
else if (l <= ql && r <= qr) return aint[nod];
int mid = (l + r) / 2;
return merge (
qry(2 * nod , l , mid , ql , qr) ,
qry(2*nod+1, mid+1 , r, ql , qr)
);
}
data merge (data f1 , data f2)
{
return f2.o(f1);
}
void print ()
{
for (int nod = 1; nod < aint.size(); nod++)
{
cout << nod << ": " << aint[nod].a << ' ' << aint[nod].b << ' ' << aint[nod].y << '\n';
}
}
};
int main ()
{
int teste; cin >> teste;
while (teste--) {
int n, q; cin >> n >> q;
ll h; cin >> h;
for (int i = 1; i <= n; i++)
{
char c; cin >> c;
if (c == 'B')
{
ll b; cin >> b;
initial[i] = {b, b, 0};
}
else if (c == 'K')
{
ll k; cin >> k;
initial[i] = {k-1 , INF , k};
}
else {
ll c; cin >> c;
initial[i] = {0, c, c};
}
}
AINT<function> aint(n);
while (q--)
{
// aint.print();
char t; cin >> t;
if (t == 'Z')
{
int x;
char c; cin >> x >> c;
if (c == 'B')
{
ll b; cin >> b;
aint.update(x, {b, b, 0});
}
else if (c == 'K')
{
ll k; cin >> k;
aint.update(x, {k-1 , INF , k});
}
else {
ll c; cin >> c;
aint.update(x, {0, c, c});
}
}
else {
int pos; cin >> pos;
cout << aint.CB(pos , h) << '\n';
}
}
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Runtime Error
input:
1 2000000 4000000 1000000000000 B 2982992025 B 1226542907 B 2299259203 B 1223702056 B 1407121251 B 340783317 B 1259091208 B 2101980047 B 2611543443 B 2010658889 B 4233714406 B 3112120167 B 2311876255 B 2789960428 B 3008572010 B 1 B 2464951378 B 1364240867 B 2829584762 B 2511437438 B 692948679 B 1113...
output:
835343 241687 1021709