int main() {

  int high, low;
  int l, r;

  scanf("%d", &N);
  scanf("%s", S + 1);
  highs.init(N + 1);
  lows.init(N + 1);

  high = 0;
  low = 0;
  highs.update(0, 0);
  lows.update(0, 0);
  middle[0] = 0;
  qs[0] = 0;
  for (int i = 1; i <= N; i++) {
    middle[i] = middle[i - 1];
    qs[i] = qs[i - 1];
    switch(S[i]) {
      case '(':
        high++;
        low++;
        middle[i]++;
        break;
      case ')':
        high--;
        low--;
        middle[i]--;
        break;
      case '?':
        high++;
        low--;
        qs[i]++;
        break;
    }
    highs.update(i, high);
    lows.update(i, low);
  }

  scanf("%d", &Q);
  for (int q = 0; q < Q; q++) {
    scanf("%d%d", &l, &r);
    l--;
    printf("%s\n", query(l, r) ? "Yes" : "No");
  }

  return 0;
}
Beispiel #2
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;
}
Beispiel #3
0
int main() {
    int n, m, l, r;
    set<pair<int, int> > st;

    scanf("%d%d", &n, &m);
    scanf("%s", buf);
    sa.init(n, buf);
    rmq.init(n, sa.height);

    l = 0;
    r = 1;
    for (int i = 0; i < m; ++i) {
        scanf("%s", op);
        int& t = op[0] == 'L' ? l : r;
        t += op[1] == '+' ? 1 : -1;
        int k = sa.rank[l];
        int lo = 0, hi = k;
        while (lo < hi) {
            int mi = (lo + hi) / 2;
            if (rmq.value(mi + 1, k + 1) >= r - l) {
                hi = mi;
            } else {
                lo = mi + 1;
            }
        }
        st.insert(make_pair(hi, r - l));
    }
    printf("%d\n", (int)st.size());

    return 0;
}
Beispiel #4
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;
    }
  }
Beispiel #5
0
int main() {
	int re, n, a, b, c;

	scanf("%d", &re);
	for (int ri = 1; ri <= re; ++ri) {
		scanf("%d", &n);
		for (int i = 0; i < n; ++i) {
			e[i].clear();
			v[i] = w[i] = 0;
		}
		for (int i = 1; i < n; ++i) {
			scanf("%d%d", &a, &b);
			e[a].push_back(b);
			e[b].push_back(a);
		}

		m = rmq.n = 0;
		dfs(0);
		rmq.init();

		scanf("%d", &m);
		fill(v, v + n, 0);
		fill(w, w + n, 0);
		for (int i = 0; i < m; ++i) {
			scanf("%d%d%d", &a, &b, &c);
			v[a] += c;
			v[b] += c;
			w[lca(a, b)] += c;
		}

		gao(0);
		printf("Case #%d:\n", ri);
		for (int i = 0; i < n; ++i) {
			printf("%d\n", v[i] - w[i]);
		}
	}

	return 0;
}