Cod sursa(job #1709263)

Utilizator UBB_HakunaMatataUBB Cozma Nechita Pop UBB_HakunaMatata Data 28 mai 2016 11:31:14
Problema Pq Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream fin("pq.in");
ofstream fout("pq.out");
#define MAX 100010

int aint[4 * MAX];

struct sebi{
    int l, r, ind, tip;
} q[2 * MAX];

int ind, val, le, r;
int n, m, dr, a[MAX], last[MAX];

inline bool cmp(sebi a, sebi b)
{
    if(a.r == b.r)
        return a.tip < b.tip;
    return a.r < b.r;
}

void update(int nod, int st, int dr)
{
    if(st == dr)
    {
        aint[nod] = val;
        return;
    }
    int mij = (st + dr) >> 1;
    if(ind <= mij)
        update(2 * nod, st, mij);
    else
        update(2 * nod + 1, mij + 1, dr);
    aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}

int query(int nod, int st, int dr)
{
    if(le <= st && dr <= r)
        return aint[nod];
    int mij = (st + dr) >> 1;
    int val = -1;
    if(le <= mij)
        val = max(val, query(2 * nod, st, mij));
    if(mij + 1 <= r)
        val = max(val, query(2 * nod + 1, mij + 1, dr));
    return val;
}

int main()
{
    int i;
    fin >> n >> m;
    dr = 0;
    for(i = 1 ; i <= n ; i++)
    {
        fin >> a[i];
        q[++dr] = {last[a[i]], i, i, 0};
        last[a[i]] = i;
    }
    for(i = 1 ; i <= m ; i++)
    {
        fin >> le >> r;
        q[++dr] = {le, r, i, 1};
    }
    sort(q + 1, q + dr + 1, cmp);
    memset(aint, -1, sizeof(aint));
    for(i = 1 ; i <= dr ; i++)
    {
        if(q[i].tip == 0)
        {
            ind = q[i].l;
            val = q[i].r - q[i].l;
            if(ind)
                update(1, 1, n);
        }
        else
        {
            le = q[i].l;
            r = q[i].r;
            fout << query(1, 1, n) << "\n";
        }
    }
}