ASD

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 2

#include<bits/stdc++.

h>
using namespace std;

#define N 10000007
#define rep(i,n) for(int i=1;i<=n;i++)
//build(1,1,n) build the tree from 1 to n
//query(1,1,n,a,b) query in a to b range for 1 to n array
//update(1,1,n,x,v) update xth node with value v for 1 to n array
//everything o(4*logN)
pair<int,int> ara[N],tree[4*N];
void build(int node,int b,int e)//node,begin,end
{
if(b==e){
tree[node]=ara[b];
return;
}
int left=node*2;
int right=node*2+1;
int mid=(b+e)/2;
build(left,b,mid);
build(right,mid+1,e);
tree[node]=max(tree[left],tree[right]);//change accordingly
}
pair<int,int> query(int node,int b,int e,int i,int j)//node,begin,end,range of
query(i,j)
{
if(i>e || j<b)
return {0,INT_MAX};//return something that doesnt effect the result
if(b>=i && e<=j)
return tree[node];
int left=node*2;
int right=node*2+1;
int mid=(b+e)/2;
pair<int,int> p1=query(left,b,mid,i,j);
pair<int,int> p2=query(right,mid+1,e,i,j);
return max(p1,p2);//change accordingly
}
void update(int node,int b,int e,int i,int
value)//node,begin,end,updating(position,value)
{

if(i>e || i<b)
return;
if(b>=i && e<=i){
tree[node].first=value;
return;
}
int left=node*2;
int right=node*2+1;
int mid=(b+e)/2;
update(left,b,mid,i,value);
update(right,mid+1,e,i,value);
tree[node]=max(tree[left],tree[right]);//change accordingly
}

int main()
{
ios_base:: sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
int n,q;
cin>>n;
rep(i,n){
cin>>ara[i].first;
ara[i].second=i;
}
cin>>q;
build(1,1,n);
while(q--){
char a;
cin>>a;
if(a=='U'){
int v,x;
cin>>x>>v;
update(1,1,n,x,v);
}
else if(a=='Q'){
int x,y;
cin>>x>>y;
auto ff=query(1,1,n,x,y);
int aa=ff.first;
int no=ff.second;
update(1,1,n,no,-1);
auto ss=query(1,1,n,x,y);
int bb=ff.first;
cout<<aa+bb<<endl;
update(1,1,n,no,aa);
}
}
return 0;
}

You might also like