Submission #1120143

#TimeUsernameProblemLanguageResultExecution timeMemory
1120143AvianshPilot (NOI19_pilot)C++17
100 / 100
670 ms84812 KiB
#include <bits/stdc++.h>

using namespace std;

struct dsu{
    vector<int>root;
    vector<int>siz;
    dsu(int n){
        root=vector<int>(n);
        iota(root.begin(),root.end(),0);
        siz=vector<int>(n,1);
    }
    bool unite(int x, int y){
        x=findRoot(x);
        y=findRoot(y);
        if(x==y)
            return 0;
        if(siz[x]<siz[y])
            swap(x,y);
        siz[x]+=siz[y];
        root[y]=x;
        return 1;
    }
    int findRoot(int x){
        if(root[x]==x){
            return x;
        }
        return root[x]=findRoot(root[x]);
    }
    int sizx(int x){
        x=findRoot(x);
        return siz[x];
    }
};

long long lenans(int x){
    return (1LL*x*(x+1))/2;
}

const int MAX_LEN=1e6+5;

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,q;
    cin >> n >> q;
    int h[n];
    vector<int> mp[MAX_LEN];
    for(int i = 0;i<n;i++){
        cin >> h[i];
        mp[h[i]].push_back(i);
    }
    long long currans = 0;
    bool val[n];
    dsu ds(1e6+5);
    fill(val,val+n,0);
    long long ans[MAX_LEN];
    for(int i = 0;i<MAX_LEN;i++){
        for(int ind : mp[i]){
            if(ind){
                if(val[ind-1]){
                    currans-=lenans(ds.sizx(ind-1));
                    ds.unite(ind,ind-1);
                }
            }
            if(ind<n-1){
                if(val[ind+1]){
                    currans-=lenans(ds.sizx(ind+1));
                    ds.unite(ind,ind+1);
                }
            }
            currans+=lenans(ds.sizx(ind));
            val[ind]=1;
        }
        ans[i]=currans;
    }
    while(q--){
        int x;
        cin >> x;
        cout << ans[x] << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...