Example #1
0
void CDQ(int nl, int nr)
{
	if(nl>=nr) return;
	int mid=(nl+nr)>>1;
	CDQ(nl, mid); CDQ(mid+1,nr);
	
	int tl=mid;
	for(int tr=nr; tr>mid; tr--)
	{
		while(tl>=nl && arry[tl].l >= arry[tr].l)
		{
			bit.add( arry[tl].r, arry[tl].v);
			tl--;
		}
		ans[ arry[tr].t ] += bit.sum( arry[tr].r );
	}
	for(int i=mid; i>tl; i--) bit.add( arry[i].r, -arry[i].v);
	
	tl=nl;
	int tp=nl;
	for(int tr=mid+1; tr<=nr; tr++)
	{
		while(tl<=mid && arry[tl].l < arry[tr].l) temp[tp++] = arry[tl++];
		temp[tp++] = arry[tr];
	}
	while(tl<=mid) temp[tp++] = arry[tl++];
	
	for(int i=nl; i<=nr; i++) arry[i]=temp[i];
}
Example #2
0
inline void Work(void) { 
    T.clear(); T.Add(b[1], 1); 
    int j = 0; last = 1; 
    for (int i = 2; i <= m; i++) { 
        while (j && Ask(b, i - j, b[i]) != rank[j + 1])  
            j = p[j]; 
        if (j == 0) Ask(b, i - j, b[i]);
        if (Ask(b, i - j, b[i]) == rank[j + 1]) j++; 
        p[i] = j; 
        T.Add(b[i], 1); 
    }
    T.clear(); 
    j = 0; last = 1; 
    for (int i = 1; i <= n; i++) { 
        while (j && Ask(a, i - j, a[i]) != rank[j + 1])
            j = p[j]; 
        if (j == 0) Ask(a, i - j, a[i]);
        if (Ask(a, i - j, a[i]) == rank[j + 1]) j++; 
        if (j == m) { 
            Ans[i] = true;
            j = p[j]; 
        } 
        T.Add(a[i], 1); 
    }
    f[0] = 0;
    for (int i = 1; i <= n; i++) {
//        printf("%d ", Ans[i]);
        f[i] = f[i - 1];
        if (Ans[i] > 0) f[i] = max(f[i], f[i - m] + 1);
    }
//    puts("");
    printf("%d\n", f[n]);
} 
Example #3
0
inline void Prepare(void) { 
    T.clear(); T.n = MAXH; 
    for (int i = 1; i <= m; i++) { 
        rank[i] = make_pair(T.Cal(b[i] - 1) + 1, T.Cal(b[i]));
        T.Add(b[i], 1); 
    }
}
void solve()
{
    ll ans = 0;
    BIT b;
    for (int j = 0; j < n; j++) {
	ans += j - b.sum(b.a[j]);
    }
}
Example #5
0
 void add(int x, int c) {
   assert(!col[c].count(x));
   int a = prv(x, c);
   int b = nxt(x, c);
   if (a != -1) {
     bit.del(a, b);
     bit.add(a, x);
   }
   bit.add(x, b);
   col[c].insert(x);
 }
Example #6
0
 void del(int x, int c) {
   assert(col[c].count(x));
   int a = prv(x, c);
   int b = nxt(x, c);
   bit.del(x, b);
   if (a != -1) {
     bit.del(a, x);
     bit.add(a, b);
   }
   col[c].erase(x);
 }
Example #7
0
void HLD::update(int x, int y)
{
	while(ntop[x] != ntop[y])
	{
		if( dept[ ntop[x] ] > dept[ ntop[y] ] ) swap(x,y);
		bit.update( dfsn[ ntop[y] ], dfsn[ y ], 1);
		y = fath[ ntop[y] ];
	}
	if( dept[x] > dept[y] ) swap(x,y);
	x = bson[x];
	bit.update( dfsn[x], dfsn[y], 1);
}
int main()
{
    ios::sync_with_stdio(false);
    int n = 10;
    int i, x;
    BIT T;
    while(cin >> i >> x){
        T.increment(i,x);
        FOR1(j,n) cout << T.read(j) << ' '; cout << endl;
    }
    
    return 0;
}
long long kth_smallest(long long k){
  long long lo = 0, hi = tree.size()-1;
  long long mid = -1;
  while(lo < hi){
    mid = (lo + hi)/2;
    if(k <= tree.get_sum(mid))
      hi = mid;
    else
      lo = mid + 1;
  }
  //cerr << "sum up to " << lo << " is " << tree.get_sum(lo) << endl;
  if(tree.get_sum(lo) < k) return -1;
  return lo;
}
Example #10
0
int main(void){
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &n);
        int maxa = 0;
        for(int i = 1; i <= n; i++) {
            scanf("%d", a+i);
            maxa = maxa > a[i] ? maxa: a[i];
        }

        BIT t;
        t.resize(maxa);
        t.clear();
        for(int i = 1; i <= n; i++) {
            t.add(a[i], 1);
            c[i] = t.sum(a[i] - 1);
        }
        t.clear();
        for(int i = n; i > 0; i--) {
            t.add(a[i], 1);
            d[i] = t.sum(a[i] - 1);
        }

        long long ans = 0;
        for(int i = 1; i <= n; i++) {
            ans += (long long)c[i]*(n-i-d[i]) + (long long)(i-c[i]-1)*d[i];
        }
        printf("%lld\n", ans);
    }
    return 0;
}
Example #11
0
int main () {
	int n, x, y;

	scanf("%d", &n);

	for (int i = 0; i < n; i++) {
		scanf("%d %d", &x, &y);
		freq[tree.cnt(x+1)]++;
		tree.inc(x+1);
	}

	for (int i = 0; i < n; i++) {
		printf("%d\n", freq[i]);
	}
}
Example #12
0
void solve(){
    if(!len){
        puts("Poor stack!");
        return;
    }
    b = BIT(ns);
    rep(i,ns) b.add(i,1);
    rep(i,ms){
        for(int j = k[i]-1; j >= 0; --j){
            int pos = b.find(a[j]);
            b.add(pos,-1);
        }
    }
    rep(i,ns) if(b.sum(i,i+1)) printf("%d", seq[i]);
    puts("");
}
int main() {
	int C = 0, T, q, x, y;
	scanf("%d", &T);
	while (++C <= T) {
		bit.init();
		scanf("%d", &n);
		for (int i = 1; i <= n; i++) {
			scanf("%d", &x);
			bit.modify(i, x);
		}
		scanf("%d", &q);
		while (q--) {
			scanf("%d %d", &x, &y);
			printf("%d\n", bit.query(x, y));
		}
	}
}
Example #14
0
int main() {
	ios_base::sync_with_stdio(false);

	int n, m, k;
	int x, y;

	cin >> n >> m >> k;	

	op.init(m+10);
	a.init(n+10);

	for (int i=1; i<=n; ++i) {
		cin >> x;
		a.add_interval(i, i, x);
	}
	for (int i=1; i<=m; ++i) cin >> l[i] >> r[i] >> d[i];
	for (int i=0; i<k; ++i) {
		cin >> x >> y;	
		op.add_interval(x, y, 1);
	}
	for (int i=1; i<=m; ++i) a.add_interval(l[i], r[i], op.sum(i)*d[i]);
	for (int i=1; i<=n; ++i) cout << a.sum(i) << (i < n ? " " : "\n");

	return 0;
}
Example #15
0
int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); 
	//freopen("d.in", "r", stdin);

	cin >> T;	
	while (T--){
		cin >> N;
		for (int i = 1 ; i <= N ; i++){
			cin >> A[i];
			B[i] = A[i];
		}
		
		sort(B + 1, B + N + 1);

		for (int i = 1 ; i <= N ; i++)
			ID[i] = lower_bound(B + 1, B + N + 1, A[i]) - B;

		S[N + 1] = 0;
		for (int i = N ; i >= 1 ; i--){
			S[i] = 1;
			if (ID[i] < ID[i + 1])
				S[i] += S[i + 1];
		}

		int sol = 0;
		BIT bit;

		for (int i = 1 ; i <= N ; i++){
			D[i] = 1;
			if (ID[i] > ID[i - 1])
				D[i] += D[i - 1];

			bit.update(ID[i], D[i]);

			int s = S[i] + bit.query(ID[i] - 1);

			if (sol < s)
				sol = s;
		}

		cout << sol << '\n';
	}

	return 0;
}
Example #16
0
	void init(Graph *g)
	{
		G=g;
		bit.init(G->ndn);
		dfst=0; dept[1] = 0; fath[1] = 0;
		CLR(dfsn); CLR(bson); CLR(ntop);
		dfs1(1);
		dfs2(1,1);
	}
Example #17
0
int main() {
    while (~sf("%d", &n)) {
        REP(i, n) {
            sf("%s", op[i]);
            if (op[0] == 'D' || op[0] == 'Q') {
                sf("%d%d", &seg[i][0], &seg[i][1]);
                b.pb(seg[i][0]);
                b.pb(seg[i][1]);
            }
            else {
                sf("%d", &seg[i][0]);
                b.pb(seg[i][0]);
            }
        }
        sort(all(b));
        b.resize(unique(all(b))-b.begin());
        le.init(b.size());
        ri.init(b.size());
    }
Example #18
0
int main()
{
	#ifdef LOCAL
	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
	#endif
	
	int T;
	scanf("%d", &T);
	for(int ck=1; ck<=T; ck++)
	{
		scanf("%d", &Q);
		D.siz=0;
		CLR(ans);
		
		int scnt=0;
		for(int i=1; i<=Q; i++)
		{
			int opt,l,r;
			scanf("%d%d", &opt, &l);
			arry[i].t=i;
			if(!opt)
			{
				scanf("%d", &r);
				scnt++;
				inpt[scnt][0] = l;
				inpt[scnt][1] = r;
				inpt[scnt][2] = i;
				arry[i].l = l;
				arry[i].r = r;
				arry[i].v = 1;
				D.add(l); D.add(r);
			}
			else
			{
				arry[i].l = inpt[l][0];
				arry[i].r = inpt[l][1];
				arry[i].v = -1;
			}
		}
		D.init();
		bit.init(D.siz);
		for(int i=1; i<=Q; i++)
		{
			arry[i].l = D.id(arry[i].l);
			arry[i].r = D.id(arry[i].r);
		}
		
		CDQ(1,Q);
		
		for(int i=1; i<=scnt; i++) printf("%d\n", ans[ inpt[i][2] ]);
	}
	return 0;
}
Example #19
0
	int dfs(int c, int k) {
		int iv = bit.sum(1000) - bit.sum(vertex[c]);
		if (k <= 1) {
			return iv;
		}

		visited[c] = 1;
		bit.add(vertex[c], 1);

		int res = 1 << 30;

		if (k > 1) {
			for (int v : edge[c]) {
				if (!visited[v]) {
					res = min(res, iv + dfs(v, k - 1));
				}
			}
		}

		bit.add(vertex[c], -1);
		visited[c] = 0;
		return res;
	}
Example #20
0
int main() {

  int x, r, h;
  int a, b;

  scanf("%d%d", &N, &Q);
  bit.init(MAX_X + MAX_H);
  for (int i = 0; i < N; i++) {
    scanf("%d%d%d", &x, &r, &h);
    for (int j = 0; j < h; j++) {
      bit.add(x + j + 1, (double)r * r * M_PI * h * 1.0/3.0 * (pow(h - j, 3) - pow(h - j - 1, 3)) / pow(h, 3));
    }
  }

  for (int i = 0; i < Q; i++) {
    scanf("%d%d", &a, &b);
    ans = bit.sum(b) - bit.sum(a);
    printf("%lf\n", ans);
  }

  return 0;

}
Example #21
0
	int getMinimumInversions(vector <int> A, vector <int> B, vector <int> V, int K) {
		n = (int)A.size();
		edge = IVV(n);
		vertex = V;
		for (int i = 0; i < n; ++i) {
			edge[A[i]].push_back(B[i]);
			edge[B[i]].push_back(A[i]);
		}

		int ans = 1e6;
		for (int i = 0; i < n; ++i) {
			memset(visited, 0, sizeof(visited));
			bit.init(1001);
			ans = min(ans, dfs(i, K));
		}
		return (ans < 1e6) ? ans : -1;
	}
Example #22
0
int calc(int p) {
  printf("calc(%d)\n", p);
  int cnt[20];
  memset(cnt, 0, sizeof cnt);
  int max_power = 0;
  memset(power, 0, sizeof power);
  for(int i = 0; i < n; i++) {
    int num = v[i];
    while(num % p == 0) {
      power[i]++;
      num /= p;
    }
    cnt[power[i]]++;
    max_power = max(max_power, power[i]);
  }
  printf("max_power=%d ", max_power);
  bit.init();
  for(int i = 1; i <= max_power; i++) {
    bit.add(i, cnt[i]);
  }
  int ans = 0;
  int cur = p;
  int base[20];
  for(int i = 1; cur <= maxa; i++) {
    base[i] = cur;
    cur = (cur * 1LL * p) % mod;
  }
  for(int i = 0; i < n; i++) {
    if(power[i] == 0)
      continue;
    printf("total(%d - %d)=%d ", bit.sum(max_power), bit.sum(power[i] - 1), total(bit.sum(max_power) - bit.sum(power[i] - 1)));
    ans = (ans + (base[power[i]] * 1LL * total(bit.sum(max_power) - bit.sum(power[i] - 1))) % mod) % mod;
    printf("i=%d ans=%d ", i, ans);
    for(int j = power[i] - 1; j >= 1; j--) {
      ans = (ans + (base[j] * 1LL * total(cnt[j])) % mod) % mod;
      printf("cnt[%d]=%d ans=%d ", j, cnt[j], ans);
    }
    printf("ans=%d\n", ans);
    cnt[power[i]]--;
    bit.add(power[i], -1);
  }
  return ans;
}
int main(void){
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  long long n;
  cin >> n;
  char op[n];
  long long val[n];
  for(long long i = 0; i < n; i++)
    cin >> op[i] >> val[i];
  vector<long long> orig(val, val+n);
  sort(val, val+n);
  unordered_map<long long, long long> value, reval;
  long long cur = 1;
  value[val[0]] = cur;
  reval[cur] = val[0];
  for(long long i = 1; i < n; i++){
    if(val[i] == val[i-1]) continue;
    else {
      value[val[i]] = ++cur;
      reval[cur] = val[i];
    }
  }
  for(long long i = 0; i < n; i++) orig[i] = value[orig[i]];
  //for(long long i = 0; i < n; i++) cerr << orig[i] << endl;
  tree.build(n+2);
  for(long long i = 0; i < n; i++){
    if(op[i] == 'I'){
      //cerr << "inserting: " << orig[i] << endl;
      insert(orig[i]);
    }else if(op[i] == 'D'){
      //cerr << "deleting: " << orig[i] << endl;
      erase(orig[i]);
    }else if(op[i] == 'K'){
      long long ans = kth_smallest(reval[orig[i]]);
      //cerr << "Kth: " << reval[orig[i]] << endl;
      if(ans == -1) cout << "invalid" << endl;
      else cout << reval[ans] << endl;
    }else{
      long long ans = Rank(orig[i]);
      //cerr << "Count" << endl;
      cout << ans << endl;
    }
    //tree.prlong long();
  }
}
Example #24
0
int main(int argc, const char * argv[]) {
    int ff;
    int v1, v2, t;
    char query[20];
    BIT bit;
    scanf("%d", &ff);
    for (int tt = 1; tt <= ff; tt++) {
        printf("Case %d:\n", tt);
        int n;
        scanf("%d", &n);
        bit.build(n+1);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &t);
            bit.modify(i, t);
        }
        bool fl = true;
        while (fl) {
            scanf("%s", query);
            switch (query[0]) {
                case 'Q':
                    scanf("%d %d", &v1, &v2);
                    printf("%d\n", bit.sum(v1, v2));
                    break;
                case 'A':
                    scanf("%d %d", &v1, &v2);
                    bit.modify(v1, v2);
                    break;
                case 'S':
                    scanf("%d %d", &v1, &v2);
                    bit.modify(v1, -v2);
                    break;
                case 'E':
                    fl = false;
                    break;
            }
        }
    }
}
long long Rank(long long n){
  return tree.get_sum(n-1);
}
Example #26
0
int HLD::query(int x)
{
	return bit.query( dfsn[x] );
}
Example #27
0
inline pair<int, int> Ask(int a[], int L, int t) { 
    while (last < L) 
        T.Add(a[last++], -1); 
    return make_pair(T.Cal(t - 1) + 1, T.Cal(t));
} 
Example #28
0
  int query(int l, int r) {
//    cout << bit.query(r,r) << " " << bit.query(l-1,r) << endl;
    return bit.query(r, r) - bit.query(l-1, r);
  }
Example #29
0
 void init() {
   bit.init();
   REP(i,MXN) col[i].clear();
 }
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; ++i) {
        int s;
        scanf("%d", &s);
        sect[s].push_back(i);
    }
    for (int i = 1; i <= n; ++i) scanf("%d", &need[i]);
    scanf("%d", &k);
    for (int q = 0; q < k; ++q) {
        scanf("%d%d%d", &l[q], &r[q], &a[q]);
    }

    for (int i = 1; i <= n; ++i) {
        lo[i] = 0;
        hi[i] = k;
    }
    BIT bit;
    while (!terminated()){
        // clear tree
        bit.reset();

        // generate new check
        for (int i = 1; i <= n; ++i) {
            int mid = (lo[i]+hi[i])/2;
            check[mid].push_back(i);
        }

        for (int q = 0; q < k; ++q) {
            // apply query
            if (l[q] <= r[q]) {
                bit.update(l[q], a[q]);
                bit.update(r[q]+1, -a[q]);
            }
            else {
                bit.update(l[q], a[q]);
                bit.update(1, a[q]);
                bit.update(r[q]+1, -a[q]);
            }

            // check
            for (auto &v: check[q]) {
                long long sum = 0;
                for (auto &s: sect[v]) {
                    sum += bit.query(s);
                    if (sum >= need[v]) break;
                }
                if (sum >= need[v]) {
                    hi[v] = q;
                }
                else {
                    lo[v] = q+1;
                }
            }
            check[q].clear();
        }

    }

    for (int i = 1; i <= n; ++i) {
        if (lo[i] < k) printf("%d\n", lo[i]+1);
        else puts("NIE");
    }

    return 0;
}