Submission #1217414

#TimeUsernameProblemLanguageResultExecution timeMemory
1217414_asunaaIndex (COCI21_index)C++20
110 / 110
1975 ms226004 KiB
#include <bits/stdc++.h>
using namespace std;
long long i, j, l, r, mid, p, q, k, t, n, m, a, b, c, d, ans, cnt, res, kmy[200005], kmy4[200005], st[800005];
pair <long long, long long> kmy2[200005];
struct aa{
	long long id;
	long long ll;
	long long rr;
	long long qa;
	long long qb;
	long long qc;
};

aa query[200005];
vector <aa> kmy3[200005];

const long long mod = 999993143;
string s;
bool check;
void build (long long id, long long l, long long r){
	if (l == r){
		st[id] = kmy4[l];
		return;
	}
	long long mid = (l + r) >> 1;
	build(id * 2, l, mid);
	build(id * 2 + 1, mid + 1, r);
	st[id] = st[id * 2] + st[id * 2 + 1];
}

void update (long long id, long long l, long long r, long long i, long long val){
	if (i < l || i > r){
		return;
	}
	if (l == r){
		st[id] += val;
		return;
	}
	long long mid = (l + r) >> 1;
	update(id * 2, l, mid, i, val);
	update(id * 2 + 1, mid + 1, r, i, val);
	st[id] = st[id * 2] + st[id * 2 + 1];
}

long long get (long long id, long long l, long long r, long long u, long long v){
	if (v < l || u > r){
		return 0;
	}
	if (u <= l && r <= v){
		return st[id];
	}
	long long mid = (l + r) >> 1;
	return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
}

bool cmp (pair <long long, long long> a, pair <long long, long long> b){
	return a.first > b.first;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> q;
	for (i = 1; i <= n; i += 1){
		cin >> kmy[i];
		kmy4[i] = 0;
	}
	for (i = 1; i <= q; i += 1){
		cin >> a >> b;
		query[i] = {i, 1, n, a, b, -1};
	}
	for (i = 1; i <= n; i += 1){
		kmy2[i] = make_pair(kmy[i], i);
	}
	sort(kmy2 + 1, kmy2 + n + 1, cmp);
	for (d = 1; d <= 18; d += 1){
		build(1, 1, n);
		for (i = 1; i <= n; i += 1){
			kmy3[i].clear();
		}
		for (i = 1; i <= q; i += 1){
			kmy3[(query[i].ll + query[i].rr) >> 1ll].push_back(query[i]);
		}
		p = 1;
		for (i = n; i >= 1; i -= 1){
			while (p <= n){
//				cout << p << "a\n";
				if (kmy2[p].first >= i){
					update(1, 1, n, kmy2[p].second, 1);
					p += 1;
				}
				else{
					break;
				}
			}
			for (j = 0; j < kmy3[i].size(); j += 1){
				if (query[kmy3[i][j].id].ll > query[kmy3[i][j].id].rr){
					continue;
				}
				if (get(1, 1, n, query[kmy3[i][j].id].qa, query[kmy3[i][j].id].qb) >= i){
					query[kmy3[i][j].id].qc = max(query[kmy3[i][j].id].qc, i);
					query[kmy3[i][j].id].ll = i + 1;
				}
				else{
					query[kmy3[i][j].id].rr = i - 1;
				}
			}
		}
	}
	for (i = 1; i <= q; i += 1){
		if (query[i].qa == query[i].qb){
			cout << 1 << "\n";
		}
		else{
			cout << query[i].qc << "\n";
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...