Submission #1144339

#TimeUsernameProblemLanguageResultExecution timeMemory
1144339bestbestPilot (NOI19_pilot)C++20
100 / 100
329 ms74308 KiB
#include <bits/stdc++.h>
using namespace std;
#define  en '\n'
#define  sp ' '
typedef long long ll;
#define Linux ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define pii pair<int,int>

const int N=1e6+10;

vector<int> v[N];
int n,Q,temp,t;
ll ans[N],qs[N];
bool chk;
int l[N],r[N],a[N];
//in l index is left element is right of range
//in r index is right element is left of range

int main(){Linux
    cin >> n >> Q;
    for(int i=1;i<N;i++)qs[i]=qs[i-1]+i;
    for(int i=1;i<=n;i++){
        cin >> temp;
        v[temp].push_back(i);
    }
    for(int i=1;i<N;i++){
        ans[i]=ans[i-1];
       if(v[i].empty())continue;
       for(int j:v[i]){
        r[j]=j;
        l[j]=j;

        // cout << "before" << en;
        // for(int k=1;k<=n;k++)cout << l[k] << sp;
        // cout << en;
        // for(int k=1;k<=n;k++)cout << r[k] << sp;
        // cout << en;

        int a=r[j-1],b=l[j+1];
        if(r[j-1] && l[j+1]){
            ans[i]-=qs[j-1-r[j-1]+1]+qs[l[j+1]-(j+1)+1];
            l[a]=b;
            r[b]=a;
            r[j-1]=0;
            l[j+1]=0;
            r[j]=0;
            l[j]=0;
            //cout << l[a]-a+1 << en;
            ans[i]+=qs[l[a]-a+1];
        }
        else if(r[j-1]){
            ans[i]-=qs[j-1-r[j-1]+1];
            l[a]=j;
            r[j]=a;
            r[j-1]=0;
            l[j]=0;
            //cout << j-r[j]+1 << en;
            ans[i]+=qs[j-r[j]+1];
        }
        else if(l[j+1]){
            ans[i]-=qs[l[j+1]-(j+1)+1];
            r[b]=j;
            l[j]=b;
            l[j+1]=0;
            r[j]=0;
            //cout << l[j]-j+1 << en;
            ans[i]+=qs[l[j]-j+1];
        }
        else ans[i]++;
        
        // cout << "after" << en;
        // for(int k=1;k<=n;k++)cout << l[k] << sp;
        // cout << en;
        // for(int k=1;k<=n;k++)cout << r[k] << sp;
        // cout << en << en;


       }




    }

    //for(int i=1;i<=n;i++)cout << ans[i] << en;

    while(Q--){
        cin >> t;
        cout << ans[t] << en;
    }

    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...