Chef and Sub Array
#include <iostream>
#include <stdio.h>
#define sf(i) scanf("%d", &i)
#define pf(i) printf("%d\n", i)
using namespace std;
int n, k, p;
int a[100005], b[300005];
int sum[300005], tree[700005];
string s;
void buildTree(int index, int s, int e)
{
if(s == e)
{
tree[index] = sum[s];
}
else
{
int mid = (s + e) / 2;
buildTree(2 * index + 1, s, mid);
buildTree(2 * index + 2, mid + 1, e);
tree[index] = max(tree[2 * index + 1], tree[2 * index + 2]);
}
}
int query(int index, int s, int e, int qs, int qe)
{
if(qs > e || qe < s)
return 0;
if(qs <= s && qe >= e)
return tree[index];
int mid = (s + e) / 2;
int left = query(2 * index + 1, s, mid, qs, qe);
int right = query(2 * index + 2, mid + 1, e, qs , qe);
return max(left, right);
}
int main()
{
sf(n), sf(k), sf(p);
if(k > n)
k = n;
for(int i = 0; i < n; i++)
{
sf(a[i]);
b[i] = b[i + n] = a[i];
}
cin >> s;
sum[0] = b[0];
for(int i = 1; i < k; i++)
{
sum[i] = sum[i - 1] + b[i];
}
for(int i = k; i < 2 * n; i++)
{
sum[i] = sum[i - 1] - b[i - k] + b[i];
}
buildTree(0, 0, 2 * n - 1);
int index = n;
for(int i = 0; i < p; i++)
{
if(s[i] == '!')
{
index--;
if(index == 0)
index = n;
}
else
{
int ans;
if(k < n)
{
ans = query(0, 0, 2 * n - 1, index + k - 1, index + n - 1);
}
else
{
ans = query(0, 0, 2 * n - 1, n, 2 * n - 1);
}
pf(ans);
}
}
return 0;
}
Comments
Post a Comment