Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using lli = long long;
- const lli INF = 2e18;
- int n;
- lli ar[200010];
- lli tree[2 * (1<<19)];
- lli lazy[2 * (1<<19)];
- lli build(int idx, int l, int r){
- if(l == r) {
- return tree[idx] = ar[l];
- }
- int mid = (l + r)/ 2;
- return tree[idx] = min(build(2*idx, l, mid), build(2*idx+1, mid+1, r));
- }
- void update(int idx, int l, int r, int s, int e, lli val){ // wrong update ทั้งหมดทั้งๆที่ไม่ได้อยู่ในช่วงเดียวกัน
- if(lazy[idx] != 0){
- tree[idx] += lazy[idx];
- if(l != r){
- lazy[2*idx] += lazy[idx];
- lazy[2*idx + 1] += lazy[idx];
- }
- lazy[idx] = 0;
- }
- if(l > e or r < s) return;
- if(s <= l and r <= e){
- if(l != r){
- lazy[2*idx] += val;
- lazy[2*idx + 1] += val;
- }
- tree[idx] += val;
- return;
- }
- int mid = (l + r)/ 2;
- update(2*idx, l, mid, s, e, val);
- update(2*idx + 1, mid + 1, r, s, e, val);
- tree[idx] = min(tree[2*idx], tree[2*idx + 1]);
- }
- lli query(int idx, int l, int r, int s, int e){
- if(lazy[idx] != 0){
- tree[idx] += lazy[idx];
- if(l != r){
- lazy[2*idx] += lazy[idx];
- lazy[2*idx + 1] += lazy[idx];
- }
- lazy[idx] = 0;
- }
- if(l > e or r < s) return INF;
- if(s <= l and r <= e) return tree[idx];
- int mid = (l + r)/ 2;
- return min(query(2*idx, l, mid, s, e), query(2*idx + 1, mid + 1, r, s, e));
- }
- int main(){
- scanf("%d", &n);
- for(int i=0;i<n;i++){
- scanf("%lld", &ar[i]);
- }
- build(1, 0, n-1);
- int m;
- scanf("%d", &m);
- for(int i=1;i<=m;i++){
- int l, r;
- scanf("%d%d", &l, &r);
- if(cin.peek() != '\n'){
- lli a;
- scanf("%lld", &a);
- if(l <= r) update(1, 0, n-1, l, r, a);
- else{
- update(1, 0, n-1, 0, r, a);
- update(1, 0, n-1, l, n-1, a);
- }
- }
- else {
- if(l <= r) printf("%lld\n", query(1, 0, n-1, l, r));
- else printf("%lld\n", min(query(1, 0, n-1, 0, r), query(1, 0, n-1, l, n-1)));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement