結果
| 問題 | No.833 かっこいい電車 |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-02-19 20:39:03 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 99 ms / 2,000 ms |
| コード長 | 3,167 bytes |
| 記録 | |
| コンパイル時間 | 2,462 ms |
| コンパイル使用メモリ | 223,440 KB |
| 実行使用メモリ | 13,888 KB |
| 最終ジャッジ日時 | 2026-02-19 20:39:09 |
| 合計ジャッジ時間 | 5,819 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 30 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
#define ls rt << 1
#define rs rt << 1 | 1
const int inf = 1e18;
const int N = 5e5 + 7;
int n, q, tot = 0;
struct QWQ
{
int l, r;
} T[N];
struct node
{
int val, col, lazy;
} tr[N * 2];
inline void pushup(int rt)
{
tr[rt].val = tr[ls].val + tr[rs].val;
tr[rt].col = tr[ls].col + tr[rs].col;
return;
}
inline void pushdown(int rt, int l, int r)
{
int mid = (l + r) / 2;
if (tr[rt].lazy)
{
tr[ls].lazy = tr[rt].lazy;
tr[rs].lazy = tr[rt].lazy;
tr[ls].col = tr[rt].lazy * (mid - l + 1);
tr[rs].col = tr[rt].lazy * (r - mid);
tr[rt].lazy = 0;
}
}
inline void Update(int X, int C, int l, int r, int rt)
{
if (l == r)
{
tr[rt].val += C;
return;
}
int mid = (l + r) / 2;
pushdown(rt, l, r);
if (X <= mid)
Update(X, C, l, mid, ls);
else
Update(X, C, mid + 1, r, rs);
pushup(rt);
return;
}
inline void update(int L, int R, int col, int l, int r, int rt)
{
if (L <= l && r <= R)
{
tr[rt].lazy = col;
tr[rt].col = (r - l + 1) * col;
return;
}
int mid = (l + r) / 2;
pushdown(rt, l, r);
if (L <= mid)
update(L, R, col, l, mid, ls);
if (R > mid)
update(L, R, col, mid + 1, r, rs);
pushup(rt);
}
inline int Query(int L, int R, int l, int r, int rt)
{
if (L <= l && r <= R)
return tr[rt].val;
int mid = (l + r) / 2, res = 0;
pushdown(rt, l, r);
if (L <= mid)
res += Query(L, R, l, mid, ls);
if (R > mid)
res += Query(L, R, mid + 1, r, rs);
return res;
}
inline int query(int X, int l, int r, int rt)
{
if (l == r)
return tr[rt].col;
int mid = (l + r) / 2;
pushdown(rt, l, r);
if (X <= mid)
return query(X, l, mid, ls);
return query(X, mid + 1, r, rs);
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
Update(i, x, 1, n, 1);
update(i, i, i, 1, n, 1);
T[++tot] = {i, i};
}
while (q--)
{
int op, x;
cin >> op >> x;
if (op == 3)
Update(x, 1, 1, n, 1);
else if (op == 4)
{
int tmp = query(x, 1, n, 1);
int L = T[tmp].l;
int R = T[tmp].r;
cout << Query(L, R, 1, n, 1) << "\n";
}
else if (op == 2)
{
int id1 = query(x, 1, n, 1);
int id2 = query(x + 1, 1, n, 1);
if (id1 != id2)
continue;
int L = T[id1].l;
int R = T[id1].r;
T[id1].l = x + 1;
++tot;
update(L, x, tot, 1, n, 1);
T[tot] = {L, x};
}
else
{
int id1 = query(x, 1, n, 1);
int id2 = query(x + 1, 1, n, 1);
if (id1 == id2)
continue;
T[id1].r = T[id2].r;
T[id2] = {0, 0};
update(T[id1].l, T[id1].r, id1, 1, n, 1);
}
}
}
vjudge1