Cod sursa(job #3252290)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 29 octombrie 2024 09:55:32
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bits/stdc++.h>
#define in fin
#define out fout
#define ll long long

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, m; in >> n >> m;
    ll v[n];
    for(int i = 0; i < n; i++) in >> v[i];
    ll k = sqrt(n);
    if(k * k != n) k++;
    ll b[k];

    for(int i = 0; i < k; i++) b[i] = 0;
    int it = 0;
    for(int i = 0; i < n; i++){
        if(i > 0 && i % k == 0) it++;
        b[it] += v[i];
    }

    // cout << "b : ";
    // for(int i = 0; i < k; i++) cout << b[i] << " ";
    // cout << '\n';

    for(int ii = 0; ii < m; ii++){
        ll q, l, r; in >> q >> l >> r;
        // cout << "v : ";
        // for(int i = 0; i < n; i++) cout << v[i] << " ";
        // cout << '\n';
        if(q == 1){
            l--, r--;
            if(r - l < k){ // nu incae niciun bucket intre ele
                int sum = 0;
                for(int i = l; i <= r; i++) sum += v[i];
                continue;
            }

            ll sum = 0;
            while(l % k != 0){
                sum += v[l]; l++;
            }

            while((r + 1) % k != 0){
                sum += v[r]; r--;
            }

            // cout << "l = " << l << " r = " << r << '\n';

            for(int i = l / k; i <= r / k; i++){
                sum += b[i];
                // cout << "i = " << i << " b[i] = " << b[i] << '\n';
            }
            out << sum << '\n';
        }else{
            l--;
            int it = (l / k); // la ce bucket update
            b[it] -= r;
            v[l] -= r;
        }
    }

    return 0;
}