Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const long INF = -1e9;
- long n, k;
- vector<long long> t, li, ri, a, to_push;
- void _build(){
- for(int i = n; i <= n * 2; ++i){
- t[i] = a[i - n + 1];
- }
- for(int i = n - 1; i > 0; --i){
- t[i] = max(t[i * 2], t[i * 2 + 1]);
- }
- }
- void push(int b){
- long long v = to_push[b];
- //cout << v << " " << b << endl;
- to_push[2 * b] += v;
- to_push[2 * b + 1] += v;
- t[2 * b] += v;
- t[2 * b + 1] += v;
- to_push[b] = 0;
- }
- void recalc(int id) {
- t[id] = max(t[id * 2], t[id * 2 + 1]);
- }
- void _set(int v, int L, int R, long long add) {
- //cout << li[v] << " " << ri[v] << " " << L << " " << R << endl;
- if (li[v] > R || ri[v] < L) {
- return; // Полностью не лежит. Обновление к нам не относится
- }
- if (L <= li[v] && ri[v] <= R) {
- to_push[v] += add;
- t[v] += add;
- return; //Полностью лежит внутри отрезка. Обновляем и прибавляем push
- }
- push(v); //Протолкнули добавление. ОБЯЗАТЕЛЬНО!
- _set(v * 2, L, R, add);
- _set(v * 2 + 1, L, R, add);
- recalc(v); //Пересчитали ответ. ОБЯЗАТЕЛЬНО!
- }
- long long _max(long v, long l, long r){
- //cout << v << " " << l << " " << r << " " << li[v] << " " << ri[v] << " debug" << endl;
- if(r < li[v] || l > ri[v]){
- return INF;
- }
- if(l <= li[v] && r >= ri[v]){
- return t[v];
- }
- push(v);
- return (max(_max(v * 2, l, r) , _max(v * 2 + 1, l, r)));
- }
- int main() {
- freopen("rmq.in", "r", stdin);
- //freopen("rmq.out", "w", stdout);
- cin >> n >> k;
- long gg = n;
- char c;
- for(int i = 1; ; ){
- while(i < n){
- i <<= 1;
- }
- n = i;
- break;
- }
- a.resize(2 * n, INF);
- for(int i = 1; i <= gg; ++i){
- cin >> a[i];
- }
- t.resize(2 * n + 1, INF);
- to_push.resize(2 * n + 1, 0);
- li.resize(2 * n + 1, 0);
- ri.resize(2 * n + 1, 0);
- _build();
- for(int i = n; i < 2 * n; ++i){
- li[i] = i - n + 1;
- ri[i] = li[i];
- }
- for(int i = n - 1; i > 0; --i){
- li[i] = li[i * 2];
- ri[i] = ri[i * 2 + 1];
- }
- long l, r, add;
- for(int i = 0; i < k; ++i){
- for(int i = 0; i < 3; ++i){
- cin >> c;
- }
- if(c == 'x'){
- cin >> l >> r;
- cout << _max(1, l, r) << endl;
- }
- else{
- cin >> l >> r >> add;
- _set(1, l, r, add);
- }
- }
- //for(int i = 1; i < t.size(); ++i){
- // cout << t[i] << " ";
- //}
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement