Cod sursa(job #1978583)

Utilizator raulmuresanRaul Muresan raulmuresan Data 8 mai 2017 10:54:58
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.31 kb
#include<fstream>
#include<vector>
#include<string>
#include<algorithm>
#define modulo 666013

using namespace std;

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

const int NMAX = 100005;
struct Query
{
    int st, dr, index;
};

Query a[NMAX];

string sir;
int i, n, k, j,contor,st,dr,sol,x,y,query;
int v[NMAX], last[NMAX], pos[NMAX], result[NMAX];
int MaxArb[4 * NMAX];

bool cmp(Query a, Query b)
{
    return a.st < b.st;
}

void queryAI(int nod, int start, int end, int l, int r) {
    if (l <= start && r >= end)
    {
        sol = max(sol, MaxArb[nod]);
        return;
    }

    int mij = (start + end) / 2;
    int m1 = 0, m2 = 0;
    if(l <= mij)
        queryAI(2 * nod, start, mij, l, r);
    if(mij < r)
        queryAI(2 * nod + 1, mij + 1, end, l, r);
}

void update(int nod, int start, int end, int position, int value) {
    if (start == end) {
        MaxArb[nod] = value;
        return;
    }

    int mid = (start + end) / 2;
    if ( position <= mid) {
        update(2 * nod, start, mid,  position, value);
    } else {
        update(2 * nod + 1, mid + 1, end,  position, value);
    }

    MaxArb[nod] = max(MaxArb[2 * nod], MaxArb[2 * nod + 1]);
}



int main()
{
    fin >> n >> query;
    for(i = 1; i <= n; i++)
    {
        fin >> v[i];
    }

    for(i = 1; i <= query; i++)
    {
        fin >> a[i].st >> a[i].dr;
        a[i].index = i;
    }
    sort(a + 1, a + query + 1, cmp);

    st = dr = a[1].st;
    for(i = 1; i <= query; i++)
    {
        while(dr <= a[i].dr)
        {
            int nr = v[dr];
            if(last[nr] != 0 && last[nr] >= a[i].st)
            {
                update(1, 1, n, dr, dr - last[nr]);
                pos[last[nr]] = dr;
            }

            last[nr] = dr;
            dr++;
        }
        while(st < a[i].st)
        {
            if(pos[st] != 0)
            {
                update(1, 1, n, pos[st], 0);
            }
            st++;
        }
        sol = 0;
        queryAI(1, 1, n, a[i].st, a[i].dr);
        if(sol == 0)
        {
            result[a[i].index] = -1;
        }
        else
        {
            result[a[i].index] = sol;
        }
    }
    for(i = 1; i <= query; i++)
    {
        fout << result[i] <<"\n";
    }

}