Cod sursa(job #1710675)

Utilizator MaarcellKurt Godel Maarcell Data 29 mai 2016 16:45:32
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

struct query{
    int l,r,ind;
};

int N,Q,a[100010],tree[500010],last[100010],ans[100010];
query q[100010];

bool cmp(query A, query B){
    return A.r<B.r;
}

void update(int nod, int l, int r, int pos, int val){
    if (l==r){
        tree[nod]=val;
        return;
    }

    int mid=(l+r)/2;
    if (pos<=mid) update(nod*2,l,mid,pos,val);
    else update(nod*2+1,mid+1,r,pos,val);
    tree[nod]=max(tree[nod*2],tree[nod*2+1]);
}

int query(int nod, int l, int r, int ql, int qr){
    if (ql<=l && r<=qr){
        return tree[nod];
    }

    int mid=(l+r)/2,ans=0;
    if (ql<=mid) ans=query(nod*2,l,mid,ql,qr);
    if (mid<qr) ans=max(ans,query(nod*2+1,mid+1,r,ql,qr));
    return ans;
}

int main(){
    ifstream fin("pq.in");
    ofstream fout("pq.out");
    fin >> N >> Q;

    int i;
    for (i=1; i<=N; i++) fin >> a[i];
    for (i=1; i<=Q; i++){
        fin >> q[i].l >> q[i].r;
        q[i].ind=i;
    }

    sort(q+1,q+Q+1,cmp);
    int l=0,k;
    for (k=1; k<=Q; k++){
        for (i=l+1; i<=q[k].r; i++){
            if (last[a[i]])
                update(1,1,N,last[a[i]],i-last[a[i]]);

            last[a[i]]=i;
        }

        l=q[k].r;
        ans[q[k].ind]=query(1,1,N,q[k].l,q[k].r);
    }

    for (i=1; i<=Q; i++)
        if (!ans[i]) fout << -1 << "\n";
        else fout << ans[i] << "\n";

    return 0;
}