#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define Z int
#define i128 int128
#define ii pair<int,int>
#define ld long double
#define vi vector<int>
#define vvi vector<vi>
#define vii vector<pair<int,int>>
#define FOR(i,a,b) for (int i=a;i<=b;i++)
#define FOR1(i,a,b,c) for (int i=a;i<=b;i+=c)
#define REP(i,a,b) for (int i=a;i>=b;i--)
#define REP1(i,a,b,c) for(int i=b;i>=a;i-=c)
#define endh '\n';
#define len(a) ((Z)(a).size())
#define pb(c) push_back(c)
#define elif else if
#define ppb() pop_back()
#define rong std::npos
#define all(c) (c.begin(),c.end())
#define Z int
#define lcm(a,b) ((int) (a/__gcd(a,b))*b)
#define mk(a,b) make_pair(a,b)
#define fi first
#define se second
Z dx4[]= {-1,1,0,0};
Z dy4[]= {0,0,1,-1};
string co="YES",khong="NO";
const int mod=1e9+7;
const string NAME = "facttree";
const Z maxn = 250005;
const Z oo = 1e9;
struct stbeat
{
vi ma1, ma2, maxc, sum, lazy;
stbeat(){}
stbeat(Z _n)
{
ma1 = ma2 = maxc = sum = lazy = vi (4 * _n + 7, 0);
}
void merge(Z v)
{
if (ma1[v * 2] == ma1[v *2 +1]){
ma1[v] = ma1[v * 2];
ma2[v] = max(ma2[v *2], ma2[ v * 2 + 1]);
maxc[v] = maxc[v * 2] + maxc[v * 2 + 1];
}
else if (ma1[v * 2] > ma1[v *2 + 1]){
ma1[v] = ma1[v * 2];
ma2[v] = max(ma2[v * 2], ma1[v * 2 + 1]);
maxc[v] = maxc[v * 2];
}
else{
ma1[v] = ma1[v * 2 + 1];
ma2[v] = max(ma2[v * 2 + 1], ma1[v * 2]);
maxc[v] = maxc[v *2 + 1];
}
sum[v] = sum[v * 2] + sum[v * 2 + 1];
}
void pushmin(Z v, Z val)
{
if (ma1[v] <= val) return;
sum[v] -= maxc[v] * ma1[v];
ma1[v] = val;
sum[v] += maxc[v] * ma1[v];
}
void pushadd(Z v, Z tl, Z tr, Z val)
{
if (val == 0) return;
sum[v] += (tr - tl + 1) * val;
ma1[v] += val;
if (ma2[v] != -oo) ma2[v] += val;
lazy[v] += val;
}
void push(Z v, Z tl, Z tr)
{
Z tm = tl + tr >> 1;
pushadd(v * 2, tl, tm, lazy[v]);
pushadd(v * 2 + 1, tm + 1, tr, lazy[v]);
pushmin(v * 2, ma1[v]);
pushmin(v *2 + 1, ma1[v]);
lazy[v] = 0;
}
void build(Z v, Z tl, Z tr)
{
if (tl == tr){
sum[v] = 0;
maxc[v] = 1;
ma1[v] = 0;
ma2[v] = -oo;
return;
}
Z tm = tl + tr >> 1;
build(v * 2, tl, tm);
build(v * 2 + 1, tm + 1, tr);
merge(v);
}
void add(Z v, Z tl, Z tr, Z l, Z r, Z val)
{
if (tl > tr || l > r || tl > r || tr < l) return;
if (tl >= l && tr <= r)
{
pushadd(v, tl, tr, val);
return;
}
Z tm = tl + tr >> 1;
push(v, tl, tr);
add (v *2 ,tl, tm, l, r, val);
add(v *2 + 1, tm + 1 ,tr, l, r, val);
merge(v);
}
void chmin(Z v, Z tl, Z tr, Z l, Z r, Z val)
{
if (tl > tr || l > r || tl > r || tr < l || ma1[v] <= val) return;
if (tl >= l && tr <= r && ma2[v] < val){
pushmin(v, val);
return;
}
push(v, tl, tr);
Z tm = tl + tr >> 1;
chmin(v * 2, tl ,tm, l, r, val);
chmin(v * 2 + 1, tm + 1, tr, l, r, val);
merge(v);
}
Z query(Z v, Z tl, Z tr, Z l, Z r)
{
if (tl > tr || l > r || tl > r || tr < l ) return 0;
if (tl >= l && tr <= r) return sum[v];
Z tm = tl + tr >> 1;
push(v, tl, tr);
return query(v * 2, tl, tm, l, r) + query(v * 2 + 1, tm + 1, tr, l, r);
}
};
struct bit
{
vi arr;
Z n;
bit(){}
bit(Z _n)
{
n = _n;
arr = vi ( _n + 7, 0);
}
void update(Z i, Z val)
{
for (;i <= n ; i += (i & - i)){
arr[i] += val;
}
}
Z query(Z i){
Z ans = 0;
for (;i ; i&= (i - 1)) ans += arr[i];
return ans;
}
};
Z n, m, q;
array<Z, 4> add[maxn];
Z L[maxn], R[maxn], bound[maxn], vt[maxn], ans[maxn];
vi g[maxn];
Z id = 0, cc = 0;
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m >> q;
stbeat st1(n);
st1.build(1, 1, n);
bit bit1(n);
FOR(i, 1, q){
Z type, l, r, c, k;
ans[i] = -1;
cin >> type;
if (type == 1){
cin >> l >> r >> c >> k;
st1.add(1, 1, n, l, r, -k);
bit1.update(l, k);
bit1.update(r + 1, -k);
add[++ id] = {l, r, c, k};
}
else if (type == 2){
cin >> l >> r >> k;
st1.add(1, 1, n, l, r, k);
st1.chmin(1, 1, n, l, r, 0);
}
else{
Z idx, w;
cin >> idx >> w;
Z val = bit1.query(idx) + w + st1.query(1, 1, n, idx, idx);
// cout << val << " "<< bit1.query(idx)<<" "<< st1.query(1, 1, n, idx, idx) << '\n';
ans[i] = 1;
if (val > bit1.query(idx) ) {
ans[i] = 0;
}
else{
L[i] = 1;
R[i] = id;
bound[i] = val;
vt[i] = idx;
}
}
}
// FOR(i, 1, id){
// cout << add[i][0] <<" "<< add[i][1] <<" " << add[i][2] <<" "<<add[i][3] << '\n';
// }
// FOR(i, 1, q) cout << bound[i] <<"\n";
// cout << id << '\n';
FOR(i, 0, 20){
FOR(j, 1, id) g[j].clear();
FOR(j, 1, n) bit1.arr[j] = 0;
FOR(j, 1, q){
if (R[j] && L[j] <= R[j]) {
g[(L[j] + R[j]) / 2].pb(j);
}
}
FOR(j, 1, id){
bit1.update(add[j][0], add[j][3]);
bit1.update(add[j][1] + 1, -add[j][3]);
// FOR(k, 1, n) cout <<bit1.query(k) <<" ";
// cout << '\n';
for (Z vitri : g[j]){
if (bit1.query(vt[vitri]) >= bound[vitri]) R[vitri] = j - 1;
else L[vitri] = j + 1;
}
}
}
FOR(i, 1, q){
if (ans[i] == -1) continue;
// if ( L[i] == 0){
// continue;
// }
if (ans[i] == 0) cout << 0 << '\n';
else {
cout << add[ R[i] + 1][2] << '\n';
}
}
// freopen((NAME + ".inp").c_str(),"r", stdin);
// freopen((NAME + ".out").c_str(),"w", stdout);
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |