Submission #1298804

#TimeUsernameProblemLanguageResultExecution timeMemory
1298804trinm01Fish 3 (JOI24_fish3)C++20
100 / 100
539 ms33920 KiB
// #pragma GCC optimize("O3")
// #pragma GCC optimization("Ofast,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
using namespace std;

#define int long long 
#define ll long long
#define FOR(i, l, r) for (int i = (l); i <= (r); i++)
#define FOD(i, r, l) for (int i = (r); i >= (l); i--)
#define fi first
#define se second
#define pii pair<int, int>

const ll mod = 1e9 + 7;
const int MAXN = 3e5 + 5;
const ll oo = 1e18 + 7;  
const int base = 10;

int n, D, q;
int c[MAXN];
struct query{
	int l, r, id;
}tv[MAXN];
int res[MAXN];
bool cmp(query a, query b){
	return a.r<b.r;
}

int st[4*MAXN], lz[4*MAXN];
void push(int id, int l, int r){
	if(lz[id]!=0){
		int val=lz[id];
		int mid=(l+r)/2;
		st[id*2]+=val*(mid-l+1);
		st[id*2+1]+=val*(r-mid);
		lz[id*2]+=val;
		lz[id*2+1]+=val;
		lz[id]=0;
	}
}
void update(int id, int l, int r, int i, int j, int val){
	if(l>j || r<i){
		return;
	}
	if(l>=i && r<=j){
		st[id]+=val*(r-l+1);
		lz[id]+=val;
		return;
	}
	int mid=(l+r)/2;
	push(id, l, r);
	update(id*2, l, mid, i, j, val);
	update(id*2+1, mid+1, r, i, j, val);
	st[id]=st[id*2]+st[id*2+1];
}
int get(int id, int l, int r, int i, int j){
	if(l>j || r<i){
		return 0;
	}
	if(l>=i && r<=j){
		return st[id];
	}
	int mid=(l+r)/2;
	push(id, l, r);
	return get(id*2, l, mid, i, j)+get(id*2+1, mid+1, r, i, j);
}

int ceil(int x, int y){
	return x/y+((x%y)!=0);
}

int mmb(int i){
	return c[i]-get(1, 1, n, i, i)*D;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    
    // freopen("test.txt", "r", stdin);
    // freopen("o2.out", "w", stdout);

    if(fopen(".inp", "r")){
        freopen(".inp", "r", stdin);
        freopen(".out", "w", stdout);
    }

    cin >> n >> D;
    FOR(i, 1, n){
    	cin >> c[i];
    }
    cin >> q;
    FOR(i, 1, q){
    	int l, r;
    	cin >> l >> r;
    	tv[i]={l, r, i};
    }
    sort(tv+1, tv+1+q, cmp);
    
    int j=1;
    stack<int> stk;
    FOR(i, 1, n){
    	int r=i;
    	while(!stk.empty()){
    		int l=stk.top();
    		int x=mmb(r-1), y=mmb(r);
    		if(x<=y){
    			break;
    		}
    		int k=ceil(x-y, D);
    		update(1, 1, n, l, r-1, k);
    		r=l;
    		stk.pop();
    	}
    	stk.push(r);
    	
    	while(j<=q && tv[j].r==i){
    		int ans;
    		if(mmb(tv[j].l)<0){
    			ans=-1;
    		}
    		else{
    			ans=get(1, 1, n, tv[j].l, tv[j].r);
    		}
    		res[tv[j].id]=ans;
    		j++;
    	}
    }
    
    FOR(i, 1, q){
    	cout << res[i] << '\n';
    }
    
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:87:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |         freopen(".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
Main.cpp:88:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |         freopen(".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...