Beispiel #1
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 #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
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]);
	}
}
Beispiel #4
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);
  }
Beispiel #5
0
int main ()
{
    vector<int> a (10);
    for (int i = 0; i < 10; ++i)
        a[i] = i;
    RMQ x (a);
    cout << x.getMin (5, 7);

	return 0;
}
Beispiel #6
0
    int
    test() {
        PhraseMap pm;
        pm.insert(1, "duckduckgo", "");
        pm.insert(2, "duckduckgeese", "");
        pm.insert(1, "duckduckgoose", "");
        pm.insert(9, "duckduckgoo", "");
        pm.insert(10, "duckgo", "");
        pm.insert(3, "dukgo", "");
        pm.insert(2, "luckkuckgo", "");
        pm.insert(5, "chuckchuckgo", "");
        pm.insert(15, "dilli - no one killed jessica", "");
        pm.insert(11, "aaitbaar - no one killed jessica", "");

        pm.finalize();

        RMQ st;
        vui_t weights;
        for (size_t i = 0; i < pm.repr.size(); ++i) {
            weights.push_back(pm.repr[i].weight);
        }

        st.initialize(weights);

        cout<<"\n";
        cout<<"suggest(\"d\"):\n"<<suggest(pm, st, "d")<<endl;
        cout<<"naive_suggest(\"d\"):\n"<<naive_suggest(pm, st, "d")<<endl;

        cout<<"\n";
        cout<<"suggest(\"a\"):\n"<<suggest(pm, st, "a")<<endl;
        cout<<"naive_suggest(\"a\"):\n"<<naive_suggest(pm, st, "a")<<endl;

        cout<<"\n";
        cout<<"suggest(\"b\"):\n"<<suggest(pm, st, "b")<<endl;
        cout<<"naive_suggest(\"b\"):\n"<<naive_suggest(pm, st, "b")<<endl;

        cout<<"\n";
        cout<<"suggest(\"duck\"):\n"<<suggest(pm, st, "duck")<<endl;
        cout<<"naive_suggest(\"duck\"):\n"<<naive_suggest(pm, st, "duck")<<endl;

        cout<<"\n";
        cout<<"suggest(\"k\"):\n"<<suggest(pm, st, "k")<<endl;
        cout<<"naive_suggest(\"k\"):\n"<<naive_suggest(pm, st, "k")<<endl;

        cout<<"\n";
        cout<<"suggest(\"ka\"):\n"<<suggest(pm, st, "ka")<<endl;
        cout<<"naive_suggest(\"ka\"):\n"<<naive_suggest(pm, st, "ka")<<endl;

        cout<<"\n";
        cout<<"suggest(\"c\"):\n"<<suggest(pm, st, "c")<<endl;
        cout<<"naive_suggest(\"c\"):\n"<<naive_suggest(pm, st, "c")<<endl;

        return 0;
    }
Beispiel #7
0
vp_t
suggest(PhraseMap &pm, RMQ &st, std::string prefix, uint_t n = 16) {
    pvpi_t phrases = pm.query(prefix);
    // cerr<<"Got "<<phrases.second - phrases.first<<" candidate phrases from PhraseMap"<<endl;

    uint_t first = phrases.first  - pm.repr.begin();
    uint_t last  = phrases.second - pm.repr.begin();

    if (first == last) {
        return vp_t();
    }

    vp_t ret;
    --last;

    pqpr_t heap;
    pui_t best = st.query_max(first, last);
    heap.push(PhraseRange(first, last, best.first, best.second));

    while (ret.size() < n && !heap.empty()) {
        PhraseRange pr = heap.top();
        heap.pop();
        // cerr<<"Top phrase is at index: "<<pr.index<<endl;
        // cerr<<"And is: "<<pm.repr[pr.index].first<<endl;

        ret.push_back(pm.repr[pr.index]);

        uint_t lower = pr.first;
        uint_t upper = pr.index - 1;

        // Prevent underflow
        if (pr.index - 1 < pr.index && lower <= upper) {
            // cerr<<"[1] adding to heap: "<<lower<<", "<<upper<<", "<<best.first<<", "<<best.second<<endl;

            best = st.query_max(lower, upper);
            heap.push(PhraseRange(lower, upper, best.first, best.second));
        }

        lower = pr.index + 1;
        upper = pr.last;

        // Prevent overflow
        if (pr.index + 1 > pr.index && lower <= upper) {
            // cerr<<"[2] adding to heap: "<<lower<<", "<<upper<<", "<<best.first<<", "<<best.second<<endl;

            best = st.query_max(lower, upper);
            heap.push(PhraseRange(lower, upper, best.first, best.second));
        }
    }

    return ret;
}
Beispiel #8
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;
    }
  }
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));
}
Beispiel #10
0
int lca(int i, int j) {
	i = u[i];
	j = u[j];
	if (i > j) {
		swap(i, j);
	}
	return j2i[rmq.value(i, j + 1)];
}
Beispiel #11
0
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);
}
Beispiel #12
0
 // should be called after initilizaing phrase map
 size_t
 initialize_RMQ() {
     vui_t weights;
     for (size_t i = 0; i < pm.repr.size(); ++i) {
         weights.push_back(pm.repr[i].weight);
     }
     st.initialize(weights);
     return weights.size();
 }
Beispiel #13
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;
	}
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 #15
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;
}
Beispiel #16
0
 int query(int u, int v){
   if(H[v] < H[u])swap(u,v);
   return E[rmq.query(H[u],H[v])];
 }
Beispiel #17
0
	// this heuristic preprocessing is
	// simple, since it only needs a RMQ structure
	void preprocess(vector<T>& A)
	{
		seq = A;
		// we want a max RMQ, so the 'greater' argument
		rmqMax->preprocess(seq);
	}
Beispiel #18
0
	string get_name(){
		return "Beg-RMQ(" + rmqMax->name() + ")";
	}
Beispiel #19
0
int
do_import(std::string file, uint_t limit, 
          int &rnadded, int &rnlines) {
    bool is_input_sorted = true;
#if defined USE_CXX_IO
    std::ifstream fin(file.c_str());
#else
    FILE *fin = fopen(file.c_str(), "r");
#endif

    int fd = open(file.c_str(), O_RDONLY);

    DCERR("handle_import::file:" << file << "[fin: " << (!!fin) << ", fd: " << fd << "]" << endl);

    if (!fin || fd == -1) {
        perror("fopen");
        return -IMPORT_FILE_NOT_FOUND;
    }
    else {
        building = true;
        int nlines = 0;
        int foffset = 0;

        if (if_mmap_addr) {
            int r = munmap(if_mmap_addr, if_length);
            if (r < 0) {
                perror("munmap");
                building = false;
                return -IMPORT_MUNMAP_FAILED;
            }
        }

        // Potential race condition + not checking for return value
        if_length = file_size(file.c_str());

        // mmap() the input file in
        if_mmap_addr = (char*)mmap(NULL, if_length, PROT_READ, MAP_SHARED, fd, 0);
        if (if_mmap_addr == MAP_FAILED) {
            fprintf(stderr, "length: %llu, fd: %d\n", if_length, fd);
            perror("mmap");
            if (fin) { fclose(fin); }
            if (fd != -1) { close(fd); }
            building = false;
            return -IMPORT_MMAP_FAILED;
        }

        pm.repr.clear();
        char buff[INPUT_LINE_SIZE];
        std::string prev_phrase;

        while (!is_EOF(fin) && limit--) {
            buff[0] = '\0';

            int llen = -1;
            get_line(fin, buff, INPUT_LINE_SIZE, llen);
            if (llen == -1) {
                break;
            }

            ++nlines;

            int weight = 0;
            std::string phrase;
            StringProxy snippet;
            InputLineParser(if_mmap_addr, foffset, buff, &weight, &phrase, &snippet).start_parsing();

            foffset += llen;

            if (!phrase.empty()) {
                str_lowercase(phrase);
                DCERR("Adding: " << weight << ", " << phrase << ", " << std::string(snippet) << endl);
                pm.insert(weight, phrase, snippet);
            }
            if (is_input_sorted && prev_phrase <= phrase) {
                prev_phrase.swap(phrase);
            } else if (is_input_sorted) {
                is_input_sorted = false;
            }
        }

        DCERR("Creating PhraseMap::Input is " << (!is_input_sorted ? "NOT " : "") << "sorted\n");

        fclose(fin);
        pm.finalize(is_input_sorted);
        vui_t weights;
        for (size_t i = 0; i < pm.repr.size(); ++i) {
            weights.push_back(pm.repr[i].weight);
        }
        st.initialize(weights);

        rnadded = weights.size();
        rnlines = nlines;

        building = false;
    }

    return 0;
}
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);
} 
Beispiel #21
0
int
do_import(std::string file, int sorted, uint_t limit, 
          int &rnadded, int &rnlines) {
#if defined USE_CXX_IO
    std::ifstream fin(file.c_str());
#else
    FILE *fin = fopen(file.c_str(), "r");
#endif

    int fd = open(file.c_str(), O_RDONLY);

    // Potential race condition + not checking for return value
    if_length = file_size(file.c_str());

    DCERR("handle_import::file:"<<file<<endl);

    if (!fin || !fd) {
        return -IMPORT_FILE_NOT_FOUND;
    }
    else {
        building = true;
        int nlines = 0;
        int foffset = 0;

        if (if_mmap_addr) {
            munmap(if_mmap_addr, if_length);
        }

        // mmap() the input file in
        if_mmap_addr = (char*)mmap(NULL, if_length, PROT_READ, MAP_SHARED, fd, 0);
        if (!if_mmap_addr) {
            fclose(fin);
            close(fd);
            return -IMPORT_FILE_NOT_FOUND;
        }

        pm.repr.clear();
        char buff[INPUT_LINE_SIZE];

        while (
#if defined USE_CXX_IO
               fin
#else
            !feof(fin)
#endif
               && limit--) {

            buff[0] = '\0';

#if defined USE_CXX_IO
            fin.getline(buff, INPUT_LINE_SIZE);
            const int llen = fin.gcount();
            buff[INPUT_LINE_SIZE - 1] = '\0';
#else
            char *got = fgets(buff, INPUT_LINE_SIZE, fin);
            if (!got) {
                break;
            }
            const int llen = strlen(buff);
            if (llen && buff[llen-1] == '\n') {
                buff[llen-1] = '\0';
            }
#endif

            ++nlines;

            int weight = 0;
            std::string phrase;
            StringProxy snippet;
            InputLineParser(if_mmap_addr, foffset, buff, &weight, &phrase, &snippet).start_parsing();

            foffset += llen;

            if (!phrase.empty()) {
                str_lowercase(phrase);
                DCERR("Adding: "<<weight<<", "<<phrase<<", "<<std::string(snippet)<<endl);
                pm.insert(weight, phrase, snippet);
            }
        }

        fclose(fin);
        pm.finalize(sorted);
        vui_t weights;
        for (size_t i = 0; i < pm.repr.size(); ++i) {
            weights.push_back(pm.repr[i].weight);
        }
        st.initialize(weights);

        rnadded = weights.size();
        rnlines = nlines;

        building = false;
    }

    return 0;
}
Beispiel #22
0
 void build(vvi & children){
   idx = 0;
   memset(H, -1, sizeof H);
   dfs(0, 0, children);
   rmq.build(idx,L);
 }