Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define M 200100
- int arr[M];
- //int tree[4*M];
- int tree2[4*M];
- int lazy[4*M];
- void init(int node,int b,int e)
- {
- if(b==e)
- {
- // tree[node]=arr[b];
- tree2[node]=arr[b];
- return;
- }
- int left=node*2;
- int right=left+1;
- int mid=(b+e)/2;
- init(left,b,mid);
- init(right,mid+1,e);
- //tree[node]=tree[left]+tree[right];
- tree2[node]=min(tree2[left],tree2[right]);
- }
- void update(int node,int b,int e,int i,int j,int val)
- {
- if(lazy[node])
- {
- //tree[node]+=(e-b+1)*lazy[node];
- tree2[node]+=lazy[node];
- if(b!=e)
- {
- lazy[node*2]+=lazy[node];
- lazy[node*2+1]+=lazy[node];
- }
- lazy[node]=0;
- }
- if(e<i || b>j)
- return;
- if(b>=i && e<=j)
- {
- //tree[node]+=(e-b+1)*lazy[node];
- tree2[node]+=val;
- if(b!=e)
- {
- lazy[node*2]+=val;
- lazy[node*2+1]+=val;
- }
- return;
- }
- int mid=(b+e)/2;
- int left=node<<1;
- int right=left+1;
- update(left,b,mid,i,j,val);
- update(right,mid+1,e,i,j,val);
- //tree[node]=tree[left]+tree[right];
- tree2[node]=min(tree2[left],tree2[right]);
- }
- int query(int node,int b,int e,int i,int j)
- {
- if(b>j || e<i)
- return M;
- if(lazy[node])
- {
- tree2[node]+=lazy[node];
- if(b!=e)
- {
- lazy[node*2]+=lazy[node];
- lazy[node*2+1]+=lazy[node];
- }
- lazy[node]=0;
- }
- if(b>=i && e<=j)
- {
- return tree2[node];
- }
- int mid=(b+e)/2;
- int left=node<<1;
- int right=left+1;
- int p1=query(left,b,mid,i,j);
- int p2=query(right,mid+1,e,i,j);
- return min(p1,p2);
- }
- int main()
- {
- int n,i;
- cin>>n;
- for(i=1;i<=n;i++)
- {
- cin>>arr[i];
- }
- //for(i=1;i<=n;i++)
- //1 cout<<arr[i]<<" ";
- init(1,1,n);
- int qq;
- scanf("%d ",&qq);
- string a;
- //getchar();
- while(qq--)
- {
- getline(cin, a);
- vector<int>v;
- stringstream ss(a);
- int num;
- while(ss >> num)
- {
- v.push_back(num);
- }
- //for(i=0;i<v.size();i++)
- // cout<<v[i]<<endl;
- if(v.size()==2)
- {
- int ans;
- int p=v[0]+1,q=v[1]+1;
- if(p<=q)
- {
- ans=query(1,1,n,p,q);
- }
- else
- {
- int a1=query(1,1,n,p,n);
- int a2=query(1,1,n,1,q);
- ans=min(a1,a2);
- }
- cout<<ans<<endl;
- }
- else
- {
- int p=v[0]+1;
- int q=v[1]+1;
- if(p<=q)
- {
- update(1,1,n,p,q,v[2]);
- }
- else
- {
- //int p=v[0]+1;
- //int q=v[1]+1;
- update(1,1,n,p,n,v[2]);
- update(1,1,n,1,q,v[2]);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement