Cod sursa(job #2706645)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 15 februarie 2021 16:12:53
Problema Pq Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 2.3 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#include <queue>
#include <unordered_map>

using namespace std;

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

const int N = 100005;

int n, q, x, y, last[N], pos[N], ans, Sol[N];

vector<pair<int, int> > G[N];

class SegmentTree
{
 private:

  int Tree[N * 4 + 5];

 public:

  void UpdateTree(int node, int st, int dr, int pos, int val)
  {
      if (st == dr)
          {
              Tree[node] = val;
              return;
          }
      int mij = (st + dr) >> 1;
      if (pos <= mij)
          UpdateTree(node << 1, st, mij, pos, val);
      else
          UpdateTree((node << 1) | 1, mij + 1, dr, pos, val);
      Tree[node] = max(Tree[node << 1], Tree[(node << 1) | 1]);
  }

  void QueryTree(int node, int st, int dr, int a, int b)
  {
      if (st >= a && dr <= b)
          {
              ans = max(ans, Tree[node]);
              return;
          }
      int mij = (st + dr) >> 1;
      if (a <= mij)
          QueryTree(node << 1, st, mij, a, b);
      if (b > mij)
          QueryTree((node << 1) | 1, mij + 1, dr, a, b);
  }

} SegTree;

void Read()
{
    fin >> n >> q;
    for (int i = 1; i <= n; i++)
        {
            fin >> x;
            pos[i] = last[x];
            last[x] = i;
        }
    for (int i = 1; i <= q; i++)
        {
            fin >> x >> y;
            G[y].push_back(make_pair(x, i));
        }
}

void Solve()
{
    for (int i = 1; i <= n; i++)
        {
            if (pos[i])
                SegTree.UpdateTree(1, 1, n, pos[i], i - pos[i]);
            if (!G[i].empty())
                {
                    vector<pair<int, int> >::iterator it;
                    for (it = G[i].begin(); it != G[i].end(); it++)
                        {
                            ans = 0;
                            SegTree.QueryTree(1, 1, n, (*it).first, i);
                            if (!ans)
                                ans--;
                            Sol[(*it).second] = ans;
                        }
                }
        }
}

void Print()
{
    for (int i = 1; i <= q; i++)
        fout << Sol[i] << '\n';
}

int main()
{
    Read();
    Solve();
    Print();
}