#include <iostream>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
struct Node{
int l, r, mx;
}tr[N << 2];
int h, w, n;
void pu(int u){
tr[u].mx = max(tr[u << 1].mx, tr[u << 1 | 1].mx);
}
void build(int u, int l, int r){
tr[u] = {l, r, w};
if (l == r) return;
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pu(u);
}
int query(int u, int x){
if (tr[u].l == tr[u].r){
tr[u].mx -= x;
return tr[u].l;
}
int res = 0;
if (x <= tr[u << 1].mx)
res = query(u << 1, x);
else
res = query(u << 1 | 1, x);
pu(u);
return res;
}
int main(){
while (~scanf("%d%d%d", &h, &w, &n)){
if (h > n) h = n;
build(1, 1, h);
for (int i = 1; i <= n; i ++ ){
int x;
scanf("%d", &x);
if (x > tr[1].mx)
puts("-1");
else
printf("%d\n", query(1, x));
}
}
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
struct Node{
int l, r, add, v;
}tr[N << 2];
int n, m, casei;
void pu(int u){
tr[u].v = tr[u << 1].v + tr[u << 1 | 1].v;
}
void pd(int u){
if (tr[u].add){
tr[u << 1].add = tr[u].add, tr[u << 1 | 1].add = tr[u].add;
tr[u << 1].v = tr[u].add * (tr[u << 1].r - tr[u << 1].l + 1);
tr[u << 1 | 1].v = tr[u].add * (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1);
tr[u].add = 0;
}
}
void build(int u, int l, int r){
tr[u] = {l, r, 0, 1};
if (l == r) return;
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pu(u);
}
void modify(int u, int l, int r, int z){
if (tr[u].l >= l && tr[u].r <= r){
tr[u].v = z * (tr[u].r - tr[u].l + 1);
tr[u].add = z;
return;
}
pd(u);
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid)
modify(u << 1, l, r, z);
if (r > mid)
modify(u << 1 | 1, l, r, z);
pu(u);
}
int query(int u, int l, int r){
if (tr[u].l >= l && tr[u].r <= r)
return tr[u].v;
int mid = tr[u].l + tr[u].r >> 1;
int res = 0;
if (l <= mid)
res += query(u << 1, l, r);
if (r > mid)
res += query(u << 1 | 1, l, r);
return res;
}
int main(){
int T;
cin >> T;
while (T -- ){
scanf("%d", &n);
build(1, 1, n);
scanf("%d", &m);
while (m -- ){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
modify(1, a, b, c);
}
printf("Case %d: The total value of the hook is %d.\n", ++ casei, tr[1].v);
}
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int N = 5010;
struct Node{
int l, r, v;
}tr[N << 2];
int n;
int a[N];
void pu(int u){
tr[u].v = tr[u << 1].v + tr[u << 1 | 1].v;
}
void build(int u, int l, int r){
tr[u] = {l, r, 0};
if (l == r) return;
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pu(u);
}
void update(int u, int i){
if (tr[u].l == tr[u].r && tr[u].l == i){
tr[u].v = 1;
return;
}
int mid = tr[u].l + tr[u].r >> 1;
if (i <= mid) update(u << 1, i);
else update(u << 1 | 1, i);
pu(u);
}
int query(int u, int l, int r){
if (tr[u].l >= l && tr[u].r <= r)
return tr[u].v;
int mid = tr[u].l + tr[u].r >> 1;
int res = 0;
if (l <= mid)
res += query(u << 1, l, r);
if (r > mid)
res += query(u << 1 | 1, l, r);
return res;
}
int main(){
while (~scanf("%d", &n)){
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
build(1, 0, n - 1);
int ans = INF;
int cnt = 0;
for (int i = 1; i <= n; i ++ ){
update(1, a[i]);
cnt += query(1, a[i] + 1, n - 1);
}
ans = cnt;
for (int i = 1; i < n; i ++ ){
cnt = cnt - a[i] + n - 1 - a[i];
ans = min(ans, cnt);
}
printf("%d\n", ans);
}
return 0;
}