Pagini recente » Cod sursa (job #1152033) | Cod sursa (job #2920584) | Cod sursa (job #1082621) | Cod sursa (job #1869318) | Cod sursa (job #3131004)
#include <iostream>
#include <vector>
#include <climits>
#include <fstream>
using namespace std;
ifstream in("deque.in");
ofstream out("deque.out");
struct node {
int l, r, min_val;
node* left;
node* right;
node(int l, int r) : l(l), r(r), min_val(INT_MAX), left(nullptr), right(nullptr) {}
};
void build(node* root, vector<long long int>& arr) {
if (root->l == root->r) {
root->min_val = arr[root->l];
return;
}
int mid = (root->l + root->r) / 2;
root->left = new node(root->l, mid);
root->right = new node(mid + 1, root->r);
build(root->left, arr);
build(root->right, arr);
root->min_val = min(root->left->min_val, root->right->min_val);
}
int query(node* root, int i, int j) {
if (root->l > j || root->r < i) {
return INT_MAX;
}
if (root->l >= i && root->r <= j) {
return root->min_val;
}
int mid = (root->l + root->r) / 2;
return min(query(root->left, i, j), query(root->right, i, j));
}
int main()
{
vector<long long int>sir;
long long int n,val,sum=0,interval,i;
in>>n>>interval;
for(i=0;i<n;i++)
{
in>>val;
sir.push_back(val);
}
node* root=new node(0,n-1);
build(root,sir);
for(i=0;i<n-interval+1;i++)
{
val=query(root,i,i+interval-1);
sum+=val;
}
out<<sum;
return 0;
}