Cod sursa(job #3143441)

Utilizator matwudemagogul matwu Data 30 iulie 2023 11:31:12
Problema Pq Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 2.35 kb
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 1;
ifstream fin("pq.in");
ofstream fout("pq.out");
#define cin fin
#define cout fout
int n, q, v[N];
long long  ans[N];
vector<pair<int, int>> en[N];
vector<pair<int, int>> query(N);
vector<int> fr[N];
long long aint[N * 4], lazy[N * 4];

void update(int v, int tl, int tr, int l, int r, long long val){
    if(lazy[v]){
        aint[v] = max(lazy[v], aint[v]);
        if(tl != tr){
            lazy[v * 2] = max(lazy[v], lazy[v * 2]);
            lazy[v * 2 + 1] = max(lazy[v * 2 + 1], lazy[v]);
        }
        lazy[v] = 0;
    }
    if(l <= tl && r >= tr){
        aint[v] = max(aint[v], val);
        if(tl != tr){
            lazy[v * 2] = max(val, lazy[v * 2]);
            lazy[v * 2 + 1] = max(lazy[v * 2 + 1],val);
        }
        return;
    }
    if(tr < l || tl > r) return;
    int tm = (tl + tr) / 2;
    update(v * 2, tl, tm, l, r, val);
    update(v * 2 + 1, tm + 1, tr, l, r, val);
    aint[v] = max({aint[v], aint[v * 2], aint[v * 2 + 1]});

}
int qu(int v, int tl, int tr, int l){
    if(lazy[v]){
        aint[v] = max(lazy[v], aint[v]);
        if(tl != tr){
            lazy[v * 2] = max(lazy[v], lazy[v * 2]);
            lazy[v * 2 + 1] = max(lazy[v * 2 + 1], lazy[v]);
        }
        lazy[v] = 0;
    }
    if(tl == tr){
        return aint[v];
    }
    else{
        int tm = (tl + tr) / 2;
        if(l <= tm){
            return qu(v * 2, tl, tm, l);
        }else return qu(v * 2 +  1, tm + 1, tr, l);
    }
}
int main(){
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> q;
    for(int i = 1; i <= n; i++){
        cin >> v[i];
        fr[v[i]].push_back(i);
    }
    for(int i = 1; i <= q; i++){
        int a, b;
        cin >> a >> b;
        query[i] = {a, b};
        en[b].push_back({a, i}); 
    }

    for(int i = 1; i <= n; i++){
        auto it = lower_bound(fr[v[i]].begin(), fr[v[i]].end(), i);
        int pos = it - fr[v[i]].begin();

        if(pos != 0){
            int cost = fr[v[i]][pos] - fr[v[i]][pos - 1];
            update(1, 1, n, 1, fr[v[i]][pos - 1], cost);
        }

        for(auto j : en[i]){
            int plt = qu(1, 1, n, j.first);
            ans[j.second] = (plt == 0 ? -1 : plt);
        }
    }

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