Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- pair <int,int> combine(pair<int,int> a, pair<int,int> b) {
- if (a.first < b.first)
- return a;
- if (a.first > b.first)
- return b;
- return {a.first, a.second + b.second};
- }
- void build(vector <int> &a, vector <pair<int,int> > &tree, int v, int sl, int sr) {
- if (sl == sr)
- tree[v] = {a[sl], 1}; /// make_pair(first, second)
- else {
- int sm = (sl + sr)/2;
- build(a, tree, 2*v, sl, sm);
- build(a, tree, 2*v+1, sm+1, sr);
- tree[v] = combine(tree[2*v], tree[2*v+1]);
- }
- return;
- }
- void update(vector <pair<int,int> > &tree, int v, int sl, int sr, int idx, int val) {
- if (sl == sr)
- tree[v] = {val, 1};
- else {
- int sm = (sl + sr)/2;
- if (idx <= sm) {
- update(tree, 2*v, sl, sm, idx, val);
- }
- else {
- update(tree, 2*v+1, sm+1, sr, idx, val);
- }
- tree[v] = combine(tree[2*v], tree[2*v+1]);
- }
- return;
- }
- pair <int,int> get_min(vector <pair<int,int> > &tree, int v, int sl, int sr, int l, int r) {
- if (l > r)
- return {INT_MAX, 0};
- if (sl == l && sr == r)
- return tree[v];
- else {
- int sm = (sl + sr)/2;
- return combine(get_min(tree, 2*v, sl, sm, l, min(sm,r)),
- get_min(tree, 2*v+1, sm+1, sr, max(sm+1,l), r));
- }
- }
- int main()
- {
- int n;
- cin >> n;
- vector <int> a(n);
- for (int i=0; i<n; i++)
- cin >> a[i];
- vector <pair<int,int> > tree(4*n);
- build(a, tree, 1, 0, n-1);
- int l, r;
- while (true) {
- cin >> l >> r;
- pair <int,int> ans;
- ans = get_min(tree, 1, 0, n-1, l, r);
- cout << ans.first << " " << ans.second << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement