RIDDLE - Bí hiểm

Tác giả: RR

Ngôn ngữ: C++

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <iomanip>
#include <bitset>
#include <complex>

#define FOR(i,a,b) for(int i = a; i <= b; ++i)
#define FORD(i,a,b) for(int i = a; i >= b; --i)
#define REP(i,a) for(int i = 0; i < a; ++i)
#define MP make_pair
#define PB push_back

using namespace std;

int cnt[100111], a[100111];

int main() {
    int ntest; scanf("%d", &ntest);
    while (ntest--) {
        int n, k; scanf("%d%d", &n, &k);
        int can = 0;
        FOR(i,1,n) scanf("%d", &a[i]);

        memset(cnt, 0, sizeof cnt);
        bool ok = false;
        FOR(i,1,n) {
            if (a[i] > can + 1) {
                ++cnt[a[i]];
                continue;
            }
            int save = can;
            can += a[i];
            for(int x = save + 1; x <= can + 1 && x <= 100001; ++x)
                can += cnt[x] * x;

            if (can >= k) {
                ok = true;
                printf("%d\n", i);
                break;
            }
        }
        if (!ok) puts("-1");
    }
    return 0;
}

Download