Cod sursa(job #2676514)

Utilizator OvidRata Ovidiu Ovid Data 24 noiembrie 2020 15:34:50
Problema Pq Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 2.04 kb
#include<bits/stdc++.h>
using namespace std;
#define INIT  ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount




ifstream fin("pq.in"); ofstream fout("pq.out");
#define cin fin
#define cout fout


int n, a[300010], q;

pair<pii, int> qr[100010];
vector<int> col[100010];

int seg[400010];

void build(int v, int tl, int tr){

    int mid=(tl+tr)/2;

    if(tl==tr){
        seg[v]=-1; return;
    }

    build(2*v, tl, mid); build(2*v+1, mid+1, tr);
    seg[v]=max(seg[v*2], seg[2*v+1]);
    return;
}




void update(int v, int tl ,int tr, int pos, int val){

    int mid=(tl+tr)/2;

    if(tl==tr){
        seg[v]=val; return;
    }

    if(pos<=mid){
        update(v*2, tl, mid, pos, val);
    }
    else{
        update(2*v+1, mid+1, tr, pos, val);
    }
    seg[v]=max(seg[v*2], seg[v*2+1]);
    return;
}



int query(int v, int tl, int tr, int l, int r){
    int res=-1;

    if(l>r){return -1;}

    int mid=(tl+tr)/2;

    if(  (tl==l) && (tr==r)    ){
        return seg[v];
    }

    res=max(res, query(2*v, tl, mid, l, min(mid, r) ) );
    res=max(res, query(2*v+1, mid+1, tr, max(l, mid+1), r) );
    return res;
}




int res[100010];




int32_t main(){
INIT
cin>>n>>q;
for(int i=1; i<=n; i++){
    cin>>a[i];
}
for(int i=1; i<=q; i++){
    cin>>qr[i].ft.ft>>qr[i].ft.sc;
    qr[i].sc=i;
}
sort(qr+1, qr+q+1);



build(1, 1, n);

int cr=n+1;

for(int i=q; i>=1; i--){
    int l=qr[i].ft.ft, r=qr[i].ft.sc;
    while(cr>l){
        cr--;
        if(col[a[cr] ].size()){
            update(1, 1, n, col[a[cr] ].back(), col[a[cr] ].back()-cr);
        }
        col[a[cr] ].pb(cr);
    }
    res[qr[i].sc ]=query(1, 1, n, l, r);
}

for(int i=1; i<=q; i++){
    cout<<res[i]<<"\n";
}



return 0;
}