Exemple #1
0
int main(){
	int n, ans;
	cin >> n;
	
	RMQ r;
	r.init(n);
	for(int j=0;j<n;j++){
		cin >> a[j];
		r.update(j,-a[j]);
	}
	
	for(int x=0;x<n;x++){
		int head = 0,tail = x,now;
		ans = 0;
		while(head != tail && x > 0){
			now = (head + tail)/2;
			//cout << x << "-L:" << head << " " << tail << " " << now << " " << r.query(now,x) << endl;//
			if(r.query(now,x)>=-a[x])tail=now;
			else head=now+1;
		}
		ans += x - head;
		
		head = x,tail = n-1;
		while(head != tail && x < n-1){
			now = (head + tail+1)/2;
			//cout << x << "-R:" << head << " " << tail << " " << now << " " << r.query(x,now) << endl;//
			if(r.query(x,now)>=-a[x])head=now;
			else tail=now-1;
		}
		ans += head - x;
		cout << ans << endl;
	}
	
	return 0;
}
Exemple #2
0
  REP(i, m) {
    int s = sorters[i].first;
    int t = sorters[i].second;

    int minLength = rmq.query(s-1, t);
    //dp[t] = min(minLength + 1, dp[t]);
    int next = min(minLength + 1, rmq.query(t-1, t));
    rmq.update(t-1, next);
  }
Exemple #3
0
void solve4(RMQ& rmq, vector<int>& FIRE, int N, int P){
	for (int i = P; i < N; i++){
		int start = i - P;
		int end = i - 1;
		FIRE[i] += rmq.query(start, end);
		rmq.update(i, FIRE[i]);
	}
}
bool query(int l, int r) {
  int updowns = qs[r] - qs[l] - abs(middle[r] - middle[l]);
  int ups, summit;
  int ups_min, downs_min;
  if (updowns < 0) {
    return false;
  }
  if (updowns % 2 != 0) {
    return false;
  }
  ups = updowns / 2 + max(0, middle[l] - middle[r]);
  summit = max((int)(lower_bound(qs+ l, qs + r, qs[l] + ups) - qs), l);
  ups_min = highs.query(l, summit + 1);
  downs_min = lows.query(summit + 1, r + 1);
  return (ups_min == INF || ups_min == highs.query(l, l + 1))
      && (downs_min == INF || downs_min == lows.query(r, r + 1));
}
ll without(RMQ<pii>& minxrmq, RMQ<pii>& minyrmq, RMQ<pii>& maxxrmq, RMQ<pii>& maxyrmq, int l, int r, int excluded) {
    pii minx = min(minxrmq.query(l, excluded), minxrmq.query(excluded + 1, r));
    pii miny = min(minyrmq.query(l, excluded), minyrmq.query(excluded + 1, r));
    pii maxx = min(maxxrmq.query(l, excluded), maxxrmq.query(excluded + 1, r));
    pii maxy = min(maxyrmq.query(l, excluded), maxyrmq.query(excluded + 1, r));

    ll dx = (-maxx.first - minx.first);
    ll dy = (-miny.first - maxy.first);
    return max(dx, dy);
}
Exemple #6
0
	long long query(int delta_t, T delta_v){
		// only positive deltas
		assert (delta_t > 0);
		ans = 0;
		int n = seq.size();
		// this loop fix each possible beginning 
		// and checks inside it if it is valid
		for (int i = 0; i < seq.size(); ++i){
			int m = rmqMax->query(i, (i + delta_t < n )? (i+delta_t): n - 1);
			if (seq[m] - seq[i] >= delta_v) ++ans;
		}
		return ans;
	}
Exemple #7
0
int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);
  ll n,q,c,x,y;
  RMQ rmq;
  cin >> n >> q;
  rmq.init(n);
  rep(i,q){
    cin >> c >> x >> y;
    if(c == 0){
      rmq.update(x,y);
    }
    else{
      cout << rmq.query(x,y) << endl;
    }
  }
Exemple #8
0
 int query(int u, int v){
   if(H[v] < H[u])swap(u,v);
   return E[rmq.query(H[u],H[v])];
 }
int commonPrefix(SA &sa, RMQ &rmq, int p1, int p2){
  p1 = sa.rnk[p1];
  p2 = sa.rnk[p2];
  if (p1 > p2) swap(p1, p2);
  return rmq.query(p1, p2 - 1);
}