Pagini recente » Cod sursa (job #2936269) | Cod sursa (job #2356180) | Cod sursa (job #2564444) | Cod sursa (job #1397841) | Cod sursa (job #3304311)
#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;
}