Submission #576117

#TimeUsernameProblemLanguageResultExecution timeMemory
576117urd05Employment (JOI16_employment)C++17
100 / 100
305 ms14888 KiB
#include <bits/stdc++.h>
using namespace std;

typedef pair<int,int> P;
typedef pair<P,int> Pi;
int val[200001];
P a[200002];
int n,m;
vector<Pi> query;
vector<int> pr;
const int sz=524288;
int seg[sz*2];

int sum(int l,int r,int node=1,int nodel=0,int noder=sz-1) {
    if (r<nodel||l>noder) {
        return 0;
    }
    if (l<=nodel&&noder<=r) {
        return seg[node];
    }
    int mid=(nodel+noder)/2;
    return sum(l,r,node*2,nodel,mid)+sum(l,r,node*2+1,mid+1,noder);
}

void update(int i,int x) {
    i+=sz;
    seg[i]+=x;
    while (i>1) {
        i/=2;
        seg[i]=seg[i*2]+seg[i*2+1];
    }
}

int main() {
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i].first);
        a[i].second=i;
        pr.push_back(a[i].first);
    }
    for(int i=0;i<m;i++) {
        int t;
        scanf("%d",&t);
        if (t==1) {
            int b;
            scanf("%d",&b);
            query.push_back(Pi(P(t,b),-1));
        }
        else {
            int c,d;
            scanf("%d %d",&c,&d);
            pr.push_back(d);
            query.push_back(Pi(P(t,c),d));
        }
    }
    sort(pr.begin(),pr.end());
    pr.erase(unique(pr.begin(),pr.end()),pr.end());
    for(int i=1;i<=n;i++) {
        val[i]=1;
        if (a[i-1]>a[i]) {
            val[i]--;
        }
        if (a[i+1]>a[i]) {
            val[i]--;
        }
        int ind=lower_bound(pr.begin(),pr.end(),a[i].first)-pr.begin();
        update(ind,val[i]);
    }
    for(int i=0;i<m;i++) {
        if (query[i].first.first==1) {
            int b=query[i].first.second;
            int ind=lower_bound(pr.begin(),pr.end(),b)-pr.begin();
            printf("%d\n",sum(ind,sz-1));
        }
        else {
            int c=query[i].first.second;
            int d=query[i].second;
            int ind=lower_bound(pr.begin(),pr.end(),a[c].first)-pr.begin();
            update(ind,-val[c]);
            int temp[3];
            memset(temp,0,sizeof(temp));
            if (a[c-1]<a[c]) {
                temp[0]++;
            }
            if (a[c]>a[c+1]) {
                temp[2]++;
            }
            a[c]=P(d,c);
            temp[1]=1;
            if (a[c-1]<a[c]) {
                temp[0]--;
            }
            else {
                temp[1]--;
            }
            if (a[c]<a[c+1]) {
                temp[1]--;
            }
            else {
                temp[2]--;
            }
            if (c!=1) {
                int ind0=lower_bound(pr.begin(),pr.end(),a[c-1].first)-pr.begin();
                update(ind0,temp[0]);
                val[c-1]+=temp[0];
            }
            int ind1=lower_bound(pr.begin(),pr.end(),a[c].first)-pr.begin();
            update(ind1,temp[1]);
            val[c]=temp[1];
            if (c!=n) {
                int ind2=lower_bound(pr.begin(),pr.end(),a[c+1].first)-pr.begin();
                update(ind2,temp[2]);
                val[c+1]+=temp[2];
            }
        }
    }
    return 0;
}

Compilation message (stderr)

employment.cpp: In function 'int main()':
employment.cpp:35:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 |     scanf("%d %d",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~~
employment.cpp:37:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |         scanf("%d",&a[i].first);
      |         ~~~~~^~~~~~~~~~~~~~~~~~
employment.cpp:43:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   43 |         scanf("%d",&t);
      |         ~~~~~^~~~~~~~~
employment.cpp:46:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   46 |             scanf("%d",&b);
      |             ~~~~~^~~~~~~~~
employment.cpp:51:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |             scanf("%d %d",&c,&d);
      |             ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...