Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <sstream>
- using ll = long long;
- using namespace std;
- ll inf = 1e10;
- struct Node{
- Node(ll min = inf): min(min){};
- ll min;
- ll push = 0;
- };
- struct SegTree{
- vector<Node> tree;
- int size;
- SegTree(vector<int> &arr){
- size = arr.size();
- tree.resize(size*4);
- build(0, 0, size, arr);
- }
- Node combine(Node a, Node b){
- return Node(min(a.min, b.min));
- }
- void build(ll v, ll l, ll r, vector<int> &arr){
- if(l + 1 == r){
- tree[v] = Node(arr[l]);
- return;
- }
- ll m = (l+r)/2;
- build(v*2+1, l, m, arr);
- build(v*2+2, m, r, arr);
- tree[v] = combine(tree[v*2+1], tree[v*2+2]);
- }
- void push(ll v, ll l, ll r){
- if(l+1 == r){
- return;
- }
- tree[v*2+1].push += tree[v].push;
- tree[v*2+2].push += tree[v].push;
- tree[v*2+1].min += tree[v].push;
- tree[v*2+2].min += tree[v].push;
- tree[v].push = 0;
- }
- void update(ll v, ll cl, ll cr, ll ql, ll qr, ll val){
- push(v, cl, cr);
- if(qr <= cl || cr <= ql){
- return;
- }
- if(ql <= cl && cr <= qr){
- tree[v].push += val;
- tree[v].min += val;
- return;
- }
- ll mid = (cl+cr)/2;
- update(v*2+1, cl, mid, ql, qr, val);
- update(v*2+2, mid, cr, ql, qr, val);
- tree[v] = combine(tree[v*2+1], tree[v*2+2]);
- }
- void update(ll l, ll r, ll val){
- update(0, 0, size, l, r, val);
- }
- Node get(ll v, ll cl, ll cr, ll l, ll r){
- push(v, cl, cr);
- if(r <= cl || cr <= l){
- return Node();
- }
- if(l <= cl && cr <= r){
- return tree[v];
- }
- ll mid = (cl+cr)/2;
- Node lval = get(v*2+1, cl, mid, l, r);
- Node rval = get(v*2+2, mid, cr, l, r);
- return combine(lval, rval);
- };
- ll get(ll l, ll r){
- return get(0, 0, size, l, r).min;
- };
- void print(){
- cout << "tree: ";
- for(int i = 0; i < size*4; i++){
- cout << tree[i].min << " ";
- }
- cout << endl;
- }
- };
- int main(){
- string line;
- int n;
- cin >> n;
- vector<int> arr(n);
- for(int i = 0; i < n; i++){
- cin >> arr[i];
- }
- SegTree st(arr);
- int q;
- cin >> q;
- getline(cin, line);
- for(int i = 0; i < q; i++) {
- getline(cin, line);
- stringstream ss(line);
- vector<ll> nums;
- ll num;
- while(ss >> num){
- nums.push_back(num);
- }
- if(nums.size() == 2){
- if(nums[0] <= nums[1]){
- cout << st.get(nums[0], nums[1]+1) << endl;
- }
- else{
- cout << min(st.get(nums[0], n), st.get(0, nums[1]+1)) << endl;
- }
- }else{
- if(nums[0] <= nums[1]){
- st.update(nums[0], nums[1]+1, nums[2]);
- }
- else{
- st.update(nums[0], n, nums[2]);
- st.update(0, nums[1]+1, nums[2]);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment