Cod sursa(job #2352975)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 23 februarie 2019 19:31:43
Problema Pq Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 2.01 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream fin("pq.in");
ofstream fout("pq.out");

const int VAL=100005;

struct interval
{
    int L, R, ind;
};

interval Q[VAL];

bool operator <(const interval &A, const interval &B)
{
    return A.L<B.L;
}

int N, M, i, j, last[VAL], mx;
int ARB[4*VAL], nr, scos, ANS[VAL];
vector <int> P[VAL];
vector <int> :: iterator it;

void Initializare(int nod, int be, int en)
{
    if (be==en)
    {
        ARB[nod]=-1;
        return;
    }
    int mid=(be+en) / 2;
    Initializare(2*nod, be, mid);
    Initializare(2*nod+1, mid+1, en);
    ARB[nod]=-1;
}

void Update(int nod, int be, int en, int poz, int X)
{
    if (be==en)
    {
        ARB[nod]=X;
        return;
    }
    int mid=(be+en) / 2;
    if (be<=poz && poz<=mid)
        Update(2*nod, be, mid, poz, X);
    if (mid+1<=poz && poz<=en)
        Update(2*nod+1, mid+1, en, poz, X);
    ARB[nod]=max(ARB[2*nod], ARB[2*nod+1]);
}

void Query(int nod, int be, int en, int A, int B)
{
    if (A<=be && en<=B)
    {
        mx=max(mx, ARB[nod]);
        return;
    }
    int mid=(be+en) / 2;
    if (max(be, A)<=min(mid, B))
        Query(2*nod, be, mid, A, B);
    if (max(mid+1, A)<=min(en, B))
        Query(2*nod+1, mid+1, en, A, B);
}

int main()
{
    fin >> N >> M;
    Initializare(1, 1, N);
    for (i=1; i<=N; i++)
    {
        fin >> nr;
        if (last[nr]!=0)
        {
            Update(1, 1, N, i, i-last[nr]);
            P[last[nr]].push_back(i);
        }
        last[nr]=i;
    }
    for (i=1; i<=M; i++)
    {
        fin >> Q[i].L >> Q[i].R;
        Q[i].ind=i;
    }
    sort(Q+1, Q+M+1);
    scos=1;
    for (i=1; i<=M; i++)
    {
        while (scos<Q[i].L)
        {
            for (it=P[scos].begin(); it!=P[scos].end(); it++)
                Update(1, 1, N, *it, -1);
            scos++;
        }
        mx=-1;
        Query(1, 1, N, Q[i].L, Q[i].R);
        ANS[Q[i].ind]=mx;
    }
    for (i=1; i<=M; i++)
        fout << ANS[i] << '\n';
    fin.close();
    fout.close();
    return 0;
}