Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //CH 52C circular RMQ
- /******************************************************************************
- Online C++ Compiler.
- Code, Compile, Run and Debug C++ program online.
- Write your code in this editor and press "Run" button to compile and execute it.
- *******************************************************************************/
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- struct node{
- int l, r, mid;
- int val, tag;//val := min val in subtrees, tag := added val
- node *lch, *rch;
- node(int L, int R){
- l = L;
- r = R;
- mid = (L + R) / 2;
- val = tag = 0;
- lch = rch = nullptr;
- }
- void addv(int L, int R, int V){
- //cout << l << ' ' << r << ' ' << L << ' ' << R << ' ' << V << '\n';
- if(L == l && R == r){
- tag += V;
- }else{
- val = 1e15;
- if(L <= mid){
- if(lch == nullptr)lch = new node(l, mid);
- lch->addv(L, min(mid, R), V);
- }
- if(R > mid){
- if(rch == nullptr)rch = new node(mid+1, r);
- rch->addv(max(mid+1, L), R, V);
- }
- if(lch != nullptr)val = min(val, lch->val+lch->tag);
- if(rch != nullptr)val = min(val, rch->val+rch->tag);
- }
- }
- int getv(int L, int R){
- //cout << l << ' ' << r << ' ' << val << ' ' << tag << ' ' << L << ' ' << R << '\n';
- if(L == l && R == r){
- return val + tag;
- }else{
- int ret = 1e15;
- if(L <= mid){
- if(lch == nullptr)lch = new node(l, mid);
- ret = min(ret, lch->getv(L, min(mid, R)));
- }
- if(R > mid){
- if(rch == nullptr)rch = new node(mid+1, r);
- ret = min(ret, rch->getv(max(mid+1, L), R));
- }
- return ret + tag;
- }
- }
- };
- int32_t main(){
- int n;
- cin >> n;
- node *root = new node(0, n-1);
- for(int i = 0; i < n; ++i){
- int x;
- cin >> x;
- root->addv(i, i, x);
- }
- int q;
- cin >> q;
- cin.get();
- while(q--){
- string s;
- getline(cin, s);
- stringstream ss;
- ss << s;
- int arr[3];
- int idx = 0;
- while(ss >> arr[idx])++idx;
- if(idx == 2){
- if(arr[0] <= arr[1])cout << root->getv(arr[0], arr[1]) << '\n';
- else cout << min(root->getv(arr[0], n-1), root->getv(0, arr[1])) << '\n';
- }else{
- if(arr[0] <= arr[1])root->addv(arr[0], arr[1], arr[2]);
- else{
- root->addv(arr[0], n-1, arr[2]);
- root->addv(0, arr[1], arr[2]);
- }
- }
- }
- return 0;
- }
RAW Paste Data