Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <queue>
- #include <algorithm>
- #include <string>
- #include <stack>
- #include <set>
- #include <map>
- #define pii pair <int,int>
- #define vec vector
- using namespace std;
- using ll = long long;
- using ld = long double;
- using db = double;
- void cv(vector <int> &v){
- for (auto x: v) cout<<x<<' ';
- cout<<"\n";
- }
- void cvl(vector <ll> &v){
- for (auto x: v) cout<<x<<' ';
- cout<<"\n";
- }
- void cvv(vector <vector <int> > &v){
- for (auto x: v) cv(x);
- cout<<"\n";
- }
- void cvb(vector <bool> v){
- for (bool x: v) cout<<x<<' ';
- cout<<"\n";
- }
- void cvs(vector <string> v){
- for (auto a: v){
- cout<<a<<"\n";
- }
- }
- int n,wide,q,gdN;
- int wi,ans; //длина тек-го объявления
- struct tree{
- vector <int> v;//max
- void bld(){
- int gdpow=log2(n);
- if (pow(2, gdpow) < n) gdpow++;
- gdN=pow(2,gdpow);
- v.assign(2*gdN-1, wide);
- int ch = gdN - n;
- int i = 2*gdN-1;
- while(ch--){
- i--;
- v[i]=0;
- }
- //cvl(v);
- }
- void get(int l, int r, int id){
- //cout<<"id = "<<id<<"\n";
- if (l == r){//опустились в самый низ -- пора менять максимум
- if (v[id] < wi){//дошли до самого правого, и он тоже не подошел
- ans=-1;
- return;
- }
- ans = id - gdN + 2;
- v[id] -= wi;
- int idx = id;
- while (idx > 0){
- idx = (idx-1) / 2;
- v[idx] = max(v[idx*2+1], v[idx*2+2]);
- }
- return;
- }
- int m = (l + r) / 2;
- if (v[2*id+1] >= wi){//влево
- get(l, m, 2*id+1);
- }
- else{//вправо
- get(m+1, r, 2*id+2);
- }
- }
- };
- int main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- //n-- кол-во горизонталей, w - какая ширина сначала, q - кол-во запросов
- cin>>n>>wide>>q;
- tree T;
- T.bld();
- for (int i = 0; i < q;++i){
- cin>>wi;
- T.get(0, gdN-1, 0);
- cout<<ans<<"\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement