Cod sursa(job #1714653)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 8 iunie 2016 22:51:17
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.07 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream cin("pq.in");
ofstream cout("pq.out");

const int NMAX = 100007;

struct pq {
    int x;
    int y;
    int Ind;
    int Type;
};

vector < pq > events;
int Arbi[NMAX * 4];
int n, m, Ap[NMAX];
int ans[NMAX];
int Ans;

pq make_pq(int a, int b, int c, int d) {
    pq e;
    e.x = a;
    e.y = b;
    e.Ind = c;
    e.Type = d;
    return e;
}

bool Cmp(pq a, pq b) {
    if(a.y != b.y)
        return a.y < b.y;
    return a.Type < b.Type;
}

void update(int Node, int st, int dr, int poz, int val){
    if(st == dr){
        Arbi[Node] = val;
        return;
    }
    int med = (st + dr) >> 1;
    if(med >= poz)
        update(Node * 2, st, med, poz, val);
    else
        update(Node * 2 + 1, med + 1, dr, poz, val);
    Arbi[Node] = max(Arbi[Node * 2], Arbi[Node * 2 + 1]);
}

void query(int Node, int st, int dr, int x, int y){
    if(st >= x && y >= dr){
        Ans = max(Ans, Arbi[Node]);
        return ;
    }
    int med = (st + dr) >> 1;
    if(med >= x)
        query(Node * 2, st, med, x, y);
    if(med < y)
        query(Node * 2 + 1, med + 1, dr, x, y);
}

int main() {
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) {
        int a;
        cin >> a;
        events.push_back(make_pq(Ap[a], i, i, 0));
        Ap[a] = i;
    }
    for(int i = 1; i <= m; ++i) {
        int a, b;
        cin >> a >> b;
        events.push_back(make_pq(a, b, i, 1));
    }
    sort(events.begin(), events.end(), Cmp);
    for(int i = 0; i < events.size(); ++i) {
        if(events[i].Type == 0) {
            if(events[i].x != 0) {
                update(1, 1, n, events[i].x, events[i].y - events[i].x);
            }
        }
        else {
            Ans = -1;
            query(1, 1, n, events[i].x, events[i].y);
            if(Ans == 0) {
                Ans = -1;
            }
            ans[events[i].Ind] = Ans;
        }
    }
    for(int i = 1; i <= m; ++i) {
        cout << ans[i] << "\n";
    }
    return 0;
}