Cod sursa(job #3304311)

Utilizator Cyb3rBoltSbora Ioan-David Cyb3rBolt Data 22 iulie 2025 14:49:48
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("rangemode.in");
ofstream fout("rangemode.out");
int n, tt, v[100010], blockSize, rez[100010], frq[100010];

struct Iris {
    int st, dr, index;
};
vector<Iris> block[400];

inline int cmp(Iris a, Iris b) { return a.dr < b.dr; }

int stCurent = 1, drCurent = 0, frqMax = 0, best;

int main()
{
    fin >> n >> tt;
    blockSize = (int)sqrt(n) + 1;
    for(int i=1; i<=n; i++) fin >> v[i];
    for(int i=1; i<=tt; i++) {
        int st, dr; fin >> st >> dr;
        block[st / blockSize].push_back({st, dr, i});
    }
    for(int i=0; i<=blockSize; i++) {
        if(block[i].empty()) continue;
        sort(block[i].begin(), block[i].end(), cmp);
        for(int j=stCurent; j<=drCurent; j++) frq[v[j]] = 0;
        stCurent = max(i * blockSize, 1);
        drCurent = min(n, (i + 1) * blockSize);
        frqMax = 0;
        for(Iris j : block[i]) {
            while(drCurent < j.dr) {
                drCurent++;
                frq[v[drCurent]]++;
                if(frq[v[drCurent]] > frqMax) frqMax = frq[v[drCurent]], best = v[drCurent];
                else if(frq[v[drCurent]] == frqMax && v[drCurent] < best) best = v[drCurent];
            }
            int brutFrqMax = 0, brutBest;
            for(int k=min(j.dr, (i + 1) * blockSize); k>=j.st; k--) {
                frq[v[k]]++;
                if(frq[v[k]] > brutFrqMax) brutFrqMax = frq[v[k]], brutBest = v[k];
                else if(frq[v[k]] == brutFrqMax && v[k] < brutBest) brutBest = v[k];
            }
            if(frqMax > brutFrqMax) rez[j.index] = best;
            else if(frqMax == brutFrqMax && best < brutBest) rez[j.index] = best;
            else rez[j.index] = brutBest;
            for(int k=min(j.dr, (i + 1) * blockSize); k>=j.st; k--) frq[v[k]]--;
        }
    }
    for(int i=1; i<=tt; i++) fout << rez[i] << '\n';

    return 0;
}