이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int N = 1000002;
struct Seg{
int siz;
vector<int> v,lazy;
void init(int n){
siz = 1;
while(siz < n)siz *= 2;
v.assign(siz * 2 , 0);
lazy.assign(siz*2,0);
}
void set(int l , int r , int val, int x , int lx , int rx){
if(l >= rx || r <= lx)return;
if(lx >= l && rx <= r){
v[x] += val*(rx-lx);
lazy[x]+=val;
return;
}
lazy[2 * x + 1] += lazy[x];
lazy[2 * x + 2] += lazy[x];
int m = (lx + rx)/2;
v[2*x+1]+=lazy[x]*(m-lx);
v[2*x+2]+=lazy[x]*(rx-m);
lazy[x] = 0;
set(l,r,val,2*x+1,lx,m);
set(l,r,val,2*x+2,m,rx);
v[x]=v[2*x+1] + v[2*x+2];
}
void set(int l, int r , int val){
set(l,r,val,0,0,siz);
}
int sum(int pos , int x, int lx , int rx){
if(rx-lx==1)return v[x];
lazy[2 * x + 1] += lazy[x];
lazy[2 * x + 2] += lazy[x];
int m = (lx + rx)/2;
v[2*x+1]+=lazy[x]*(m-lx);
v[2*x+2]+=lazy[x]*(rx-m);
lazy[x] = 0;
return (pos < m ? sum(pos,2*x+1,lx,m):sum(pos,2*x+2,m,rx));
}
int sum(int pos){
return sum(pos,0,0,siz);
}
};
void solve(){
int n , m;
cin >> n >> m;
Seg st;
st.init(N);
int arr[n];
for(int i = 0; i < n; i++){
cin >> arr[i];
if(i){
st.set(min(arr[i],arr[i-1]),max(arr[i],arr[i-1])+1,1);
}
}
while(m--){
int t;
cin >> t;
if(t==1){
int i , val;
cin >> i >> val;
i--;
if(i){
st.set(min(arr[i],arr[i-1]),max(arr[i],arr[i-1])+1,-1);
}
i++;
if(i < n){
st.set(min(arr[i],arr[i-1]),max(arr[i],arr[i-1])+1,-1);
}
i--;
arr[i] = val;
if(i){
st.set(min(arr[i],arr[i-1]),max(arr[i],arr[i-1])+1,1);
}
i++;
if(i < n){
st.set(min(arr[i],arr[i-1]),max(arr[i],arr[i-1])+1,1);
}
}
else {
int pos;
cin>>pos;
cout << st.sum(pos) << '\n';
}
}
}
int main() {
// your code goes here
// int t;
// cin >> t;
// while(t--){
solve();
// }
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |