제출 #157172

#제출 시각아이디문제언어결과실행 시간메모리
157172easruiEmployment (JOI16_employment)C++14
100 / 100
355 ms11912 KiB
#include <bits/stdc++.h>
#define va first
#define vb second
using namespace std;
typedef pair<int,int> pii;
const int MN = 2e5+5;
int A[MN],G[MN],T[4*MN],N,M,S;
vector<int> V;
pii Q[MN];

void upt(int s, int e, int x, int y, int val, int pos)
{
    //if(s==0 && e==S) cout << x << ' ' << y << ' ' << val << '\n';
    if(e<x || y<s) return;
    if(x<=s && e<=y){
        T[pos] += val;
        return;
    }
    int m = (s+e)/2;
    upt(s,m,x,y,val,2*pos);
    upt(m+1,e,x,y,val,2*pos+1);
}

int act(int s, int e, int x, int pos)
{
    if(x<s || e<x) return 0;
    if(s==e) return T[pos];
    int m = (s+e)/2;
    return T[pos]+act(s,m,x,2*pos)+act(m+1,e,x,2*pos+1);
}


bool comb(int x)
{
    return A[x]!=-1&&x<N&&x>1&&A[x]<=A[x-1]&&A[x]<A[x+1];
}

bool isol(int x)
{
    return (x==1||A[x-1]==-1||A[x]>A[x-1])&&(x==N||A[x+1]==-1||A[x]>=A[x+1]);
}

void trans(int x, int val)
{
    if(comb(x)) upt(0,S,0,A[x],1,1);
    if(isol(x)) upt(0,S,0,A[x],-1,1);
    if(x<N){
        if(comb(x+1)) upt(0,S,0,A[x+1],1,1);
        if(!comb(x+1)&&!isol(x+1)&&A[x+1]<=A[x]) upt(0,S,0,A[x+1],1,1);
    }
    if(x>1){
        if(comb(x-1)) upt(0,S,0,A[x-1],1,1);
        if(!comb(x-1)&&!isol(x-1)&&A[x-1]<A[x]) upt(0,S,0,A[x-1],1,1);
    }
    A[x] = -1;
    if(x<N){
        if(isol(x+1)&&A[x+1]<=val) upt(0,S,0,A[x+1],-1,1);
        if(!comb(x+1)&&!isol(x+1)&&A[x+1]<=val) upt(0,S,0,A[x+1],-1,1);
    }
    if(x>1){
        if(isol(x-1)&&A[x-1]<val) upt(0,S,0,A[x-1],-1,1);
        if(!comb(x-1)&&!isol(x-1)&&A[x-1]<val) upt(0,S,0,A[x-1],-1,1);
    }
    A[x] = val;
    if(comb(x)) upt(0,S,0,A[x],-1,1);
    if(isol(x)) upt(0,S,0,A[x],1,1);
}

int main()
{
    ios_base::sync_with_stdio(0),cin.tie(0);
    cin >> N >> M;
    for(int i=1; i<=N; i++) cin >> G[i];
    int T,B,C,D;
    for(int i=0; i<M; i++){
        cin >> T;
        if(T==1){
            cin >> B;
            Q[i] = pii(B,0);
            V.push_back(B);
        }
        if(T==2){
            cin >> C >> D;
            Q[i] = pii(C,D);

        }
    }
    sort(V.begin(),V.end());
    V.erase(unique(V.begin(),V.end()),V.end());
    S = V.size();
    int val;
    for(int i=1; i<=N; i++) A[i] = -1;
    //upt(0,S,0,S-1,1,1);
    for(int i=1; i<=N; i++){
        val = upper_bound(V.begin(),V.end(),G[i])-V.begin()-1;
        //cout << val << '\n';
        trans(i,val);
    }
    //cout << act(0,S,1,1) << '\n';
    //cout << '\n';
    for(int i=0; i<M; i++){
        if(Q[i].vb){
            Q[i].vb = val = upper_bound(V.begin(),V.end(),Q[i].vb)-V.begin()-1;
            //cout << val << '\n';
            trans(Q[i].va,Q[i].vb);
        }
        else{
            Q[i].va = lower_bound(V.begin(),V.end(),Q[i].va)-V.begin();
            cout << act(0,S,Q[i].va,1) << '\n';
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...