#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int maxN = 1e5 + 7;
int t[maxN * 60], lz[maxN * 60];
int lc[maxN * 60], rc[maxN * 60];
int ptr = 1;
int new_node() {
++ptr;
t[ptr] = 0;
lz[ptr] = 0;
lc[ptr] = rc[ptr] = 0;
return ptr;
}
void push(int v, int tl, int tr) {
if (!lz[v] || tl == tr) return;
int tm = (tl + tr) / 2;
if (!lc[v]) lc[v] = new_node();
if (!rc[v]) rc[v] = new_node();
int val = lz[v];
t[lc[v]] += (tm - tl + 1) * val;
t[rc[v]] += (tr - tm) * val;
lz[lc[v]] += val;
lz[rc[v]] += val;
lz[v] = 0;
}
void upd(int v, int tl, int tr, int l, int r, int val) {
if(tl > r || tr < l) return;
if(l <= tl && tr <= r) {
t[v] += (tr - tl + 1) * val;
lz[v] += val;
return;
}
push(v, tl, tr);
int tm = (tl + tr) / 2;
if(!lc[v]) lc[v] = new_node();
if(!rc[v]) rc[v] = new_node();
upd(lc[v], tl, tm, l, r, val);
upd(rc[v], tm + 1, tr, l, r, val);
t[v] = t[lc[v]] + t[rc[v]];
}
int get(int v, int tl, int tr, int l, int r) {
if (!v || r < tl || tr < l) return 0;
if (l <= tl && tr <= r) return t[v];
push(v, tl, tr);
int tm = (tl + tr) / 2;
return get(lc[v], tl, tm, l, r) + get(rc[v], tm + 1, tr, l, r);
}
void solve() {
int q;
cin >> q;
while(q--) {
int t, l, r;
cin >> t >> l >> r;
if(t == 1) {
cout << get(1, -1e9, 1e9, l, r) << '\n';
} else {
upd(1, -1e9, 1e9, l, r, 1);
}
}
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//freopen("input.txt", "r", stdin);
int t = 1;
//cin >> t;
while(t--) solve();
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |