Example #1
0
int main()
{
	#ifdef fn
		freopen(fn ".in", "r", stdin);
		freopen(fn ".out", "w", stdout);
	#endif
	cin >> s;
	for (int i = 0; i + 1 < (int)s.size(); i++)
	{
		if (s[i] == 'A' && s[i + 1] == 'B')
			ab.insert(i);
		if (s[i] == 'B' && s[i + 1] == 'A')
			ba.insert(i);
	}
	for (int i : ab)
	{
		auto it  = ba.upper_bound(i + 1);
		if (it != ba.end())
		{
			puts("YES");
			return 0;
		}
	}
	for (int i : ba)
	{
		auto it  = ab.upper_bound(i + 1);
		if (it != ab.end())
		{
			puts("YES");
			return 0;
		}
	}
	puts("NO");
}
int main()
{
//    Open();
    int n, q;
    int cas = 0;
    while(~scanf("%d%d", &n,&q))
    {
        cas++;
        Tn = 0;
        tot = 0;
        for(int i = 0; i <= n; i++) G[i].clear();
        for(int i = 1; i < n; i++)
        {
            int u, v;
            scanf("%d%d", &u,&v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        dfs(1, -1, 0);
        dfsSeg(1, -1);

        int last = 0;
        while(q--)
        {
            int k, p, t;
            scanf("%d%d%d", &k, &p, &t);
            t--;
            S.clear();
            p += last;
            p = p%n+1;
            for(int i = 0; i < k; i++)
            {
                int x;
                scanf("%d", &x);
                bool flag = true;
                it = it1 = S.upper_bound(PII(st[x], 0));
                it2 = S.upper_bound(PII(ed[x], 0));
                if(it != S.begin()) it--;
                else flag = false;
                S.erase(it1, it2);
                if(!flag || !(it->first <= st[x] && it -> second >= ed[x]))
                    S.emplace(st[x], ed[x]);
            }
            int pre = 1;
            int ans = -1;
            for(it1 = S.begin(); it1 != S.end(); it1++)
            {
                int l = it1->first;
                if(pre < l) ans = res(ans, query(T[p], pre, l-1, t, 0), t);//, printf("%d, %d\n", pre, l-1);
                pre = it1->second + 1;
            }
            if(pre <= Tn) ans = res(ans, query(T[p], pre, Tn, t, 0), t);//, printf("%d, %d\n", pre, Tn);
            printf("%d\n", ans);
            last = max(ans, 0);
        }
    }
    return 0;
}
Example #3
0
int main()
{
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for( int i = 0; i < n; i++ )
    {
        cin >> l[i] >> r[i];
        ans[i] = -1;
    }
    for( int i = 0; i < m; i++ )
    {
        num aux; cin >> aux;
        bridges.insert( make_pair(aux, i) );
        needed[i] = -1;
    }
    for( int i = 0; i < n-1; i++ )
    {
        set< pair<num,int> >::iterator ub = bridges.upper_bound( make_pair(r[i+1]-l[i], INT_MAX)),
                                       lb = bridges.lower_bound( make_pair(l[i+1]-r[i], INT_MIN)), aux;
        aux = lb;
        if( ++aux == ub )
        {
            ans[i] = lb->second;
            used[lb->second]   = 1;
            needed[lb->second] = 0;
        }
        for(; lb != ub; ++lb) aval[i]++;
    }

    for( int i = 0; i < n-1; i++ )
    {
        if( ans[i] > 0 ) continue;
        set< pair<num,int> >::iterator ub = bridges.upper_bound( make_pair(r[i+1]-l[i], INT_MAX)),
                                       lb = bridges.lower_bound( make_pair(l[i+1]-r[i], INT_MIN)), aux;
        for( ; lb != ub; ++lb )
            if( used[lb->second] == 0 && needed[lb->second] > aval[i]  )
            {
                ans[i] = lb->second;
                used[lb->second] = 1;
                break;
            }
        if( ans[i] == -1 )
        {
            cout << "No" << endl;
            return 0;
        }
    }
    cout << "Yes" << endl;
    for( int i = 0; i < n-1; i++ )
        cout << ans[i]+1 << " ";
    cout << endl;
}
Example #4
0
int main(){
    int n,x;
    cin>>n;
    for (int i=0;i<n;++i){
        cin>>x;
        arr.push_back({x,i});
    }
    sort(arr.begin(),arr.end());
//    for (int i=0;i<n;++i){
//        cout<<arr[i].num<<" "<<arr[i].x<<endl;
//    }


    for (int i=0;i<n;++i){
        set<node1>::iterator it = a.upper_bound({0,arr[i].num});
        if (it == a.end()) up[arr[i].num] = n-1;
        else up[arr[i].num] = it->num - 1;
        a.insert({arr[i].x,arr[i].num});
    }
    for (int i=0;i<n;++i){
        set<node2>::iterator it = b.upper_bound({0,arr[i].num});
        if (it == b.end()) down[arr[i].num] = 0;
        else down[arr[i].num] = it->num + 1;
        b.insert({arr[i].x,arr[i].num});
    }

//    for (int i=0;i<n;++i){
//        cout<<up[i]<<" ";
//    }
//    cout<<endl;
//
//    for (int i=0;i<n;++i){
//        cout<<down[i]<<" ";
//    }
//    cout<<endl;

    //cout<<"hhh"<<endl;
    for (int i=0;i<n;++i)
        ans[up[arr[i].num]+1-down[arr[i].num]] = max(arr[i].x,ans[up[arr[i].num]+1-down[arr[i].num]]);
    int anst[MAXSIZE];
    anst[n] = ans[n];
    for (int i=n-1;i>=1;--i){
        anst[i] = max(anst[i+1],ans[i]);
    }

    for (int i=1;i<n;++i)
        cout<<anst[i]<<" ";
    cout<<anst[n]<<endl;
    return 0;
}
Example #5
0
int main(){
    solve1();
    s.insert(pi(-1,1e9+1));
    for (int i=0; i<n; i++) {
        set<pi> ::iterator it = s.upper_bound(pi(l[i],1e9+1));
        it--;
        pi tmp = *it;
        if(tmp.second < r[i]) continue;
        int r1 = assign(tmp.first,tmp.second);
        int r2 = assign(tmp.first,l[i]-1) + assign(r[i]+1,tmp.second) + 1;
        if(r1 != r2) continue;
        s.erase(it);
        if(tmp.first <= l[i] - 1){
            s.insert(pi(tmp.first,l[i]-1));
        }
        if(r[i]+1 <= tmp.second){
            s.insert(pi(r[i]+1,tmp.second));
        }
        res.push_back(i+1);
    }
    printf("%d\n",(int)res.size());
    for (int i=0; i<res.size(); i++) {
        printf("%d ",res[i]);
    }
}
Example #6
0
int main()
{
	freopen("4444.in","r",stdin);
    n=sc(),m=sc();
    for(int i=1;i<=n;i++)
    {
        a[++tot].l=sc(),a[tot].r=sc(),a[tot].p=i;
        if(a[tot].r<a[tot].l)a[tot].r+=m;
        ++tot;
        a[tot].l=a[tot-1].l+m;
        a[tot].r=a[tot-1].r+m;
    }
    sort(a+1,a+tot+1,cmp);  
    st.insert(make_pair(a[tot].l,tot));
    for(int i=tot-1;i;i--)
    {
        fa[i][0]=(--st.upper_bound(make_pair(a[i].r,0x7FFFFFFF)))->second;
        st.insert(make_pair(a[i].l,i));
    }
    for(int i=1;i<=18;i++)
        for(int j=tot;j;j--)
            fa[j][i]=fa[fa[j][i-1]][i-1];
    for(int i=1;i<=tot;i++)
        if(a[i].p)
            solve(i);
    for(int i=1;i<=n;i++)
        printf("%d ",ans[i]+2);
    return 0;
}
Example #7
0
int main(int argc, char const *argv[])
{
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%I64d", A + i);
        s += A[i];
        ps[i + 1] = ps[i] + A[i];
    }
    sum.insert(s);
    qu.insert(Pii(n, 0));
    for (int i = 0, p; i < n; ++i) {
        scanf("%d", &p); --p;
        auto it = qu.upper_bound(Pii(p, 0));
        // cout << it->second << " " << it->first << endl;
        ll tmp = ps[it->first] - ps[it->second];
        // cout << "tmp " << tmp << endl;
        sum.erase(sum.lower_bound(tmp));

        tmp = ps[p] - ps[it->second];
        // cout << "tmp " << tmp << endl;
        sum.insert(tmp); qu.insert(Pii(p, it->second));

        tmp = ps[it->first] - ps[p + 1];
        // cout << "tmp " << tmp << endl;
        sum.insert(tmp); qu.insert(Pii(it->first, p + 1));

        qu.erase(it);
        printf("%I64d\n", *sum.rbegin());
    }
    return 0;
}
void insert(int l, int r)
{
    if(l >= r) return;
    Interval inv(l,r);
    if(invs.empty())
    {
        invs.insert(inv);
        return;
    }
    Interval right(r+1,0);
    set<Interval>::iterator iter = invs.upper_bound(right);
    if(iter == invs.begin())
    {
        invs.insert(inv);
        return;
    }
    else
    {
        iter--;
        while( iter != invs.end() && iter->r() >= l )
        {
            if(iter->r() >= r) {
                r = iter->r();
                inv = Interval(l,r);
            }
            if(iter->l() <= l) {
                l = iter->l();
                inv = Interval(l,r);
            }
            invs.erase(iter);
            iter--;
        }
    }
    invs.insert(inv);
}
Example #9
0
main()
{
        freopen("pe.txt","r",stdin) ;
        //freopen("pe(me).txt","w",stdout) ;
    int T ;scanf("%d",&T) ;
    while(T--)
    {
        scanf("%d",&n) ;
        for(int i=1;i<=n;i++) scanf("%d",&a[i]) ;
        dp[0][0]=0 ;
        int ans=0 ;
        for(int i=0;i<=n;i++)
        {
            if(ans==n) break ;
            st.clear() ;
            if(!i) st.insert((P){0,0}) ;
            else for(int j=0;j<i;j++) st_insert((P){dp[j][i] , a[j]}) ;
            for(int j=i+1;j<=n;j++)
            {
                if(ans==n) break ;
                set<P>::iterator it=st.upper_bound((P){-1,a[j]}) ; it-- ;
                dp[i][j]=(it->len)+1 ; ans=max(ans,dp[i][j]) ;
                st_insert((P){dp[i][j] , a[j]}) ;
            }
        }
        printf("%d\n",ans) ;
    }
}
int main() { 
	ios_base::sync_with_stdio(false);
	cin >> arrayLength;
	for(int i = 0; i < arrayLength; i++) {
		cin >> numberArray[i];
		sortedArray[i] = IPair(numberArray[i], i);
	}
	sort(sortedArray, sortedArray + arrayLength);
	for(int i = 0; i < arrayLength; i++) {
		result[sortedArray[i].second] = sortedArray[i].first;
		set<int>::iterator prev = indexList.lower_bound(sortedArray[i].second);
		set<int>::iterator next = indexList.upper_bound(sortedArray[i].second);
		if(prev != indexList.begin() && indexList.size() > 0) {
			prev--;
			int indexOffset = sortedArray[i].second - *prev;
			result[sortedArray[i].second] = min(result[sortedArray[i].second], result[*prev] + indexOffset);
		}
		if(next != indexList.end()) {
			int indexOffset = *next - sortedArray[i].second;
			result[sortedArray[i].second] = min(result[sortedArray[i].second], result[*next] + indexOffset);	
		}		
		indexList.insert(sortedArray[i].second);		
	}
	for(int i = 0; i < arrayLength; i++) {
		result[i] = min(result[i], i + 1);
		result[i] = min(result[i], arrayLength - i);
	}
	for(int i = 0; i < arrayLength; i++) {
		maxResult = max(maxResult, result[i]);
	}
	cout << maxResult << "\n";
	return 0;
}
int main() {
    scanf("%d %d",&n,&m);
    for(int i = 1; i <= n; i++) s.insert(triple(i,i,ll(i))); 
    while (m--) {
        scanf("%d",&t);
        if(t == 1) {
            scanf("%d %d %I64d",&l,&r,&x);
            auto it = s.upper_bound(triple(l,r,x));
            if(it != s.begin()) it--;
            vector<triple> aux;
            while(it != s.end()) {
                triple a = *it;
                if(a.l > r) break;
                int esq = max(a.l,l);
                int dir = min(a.r,r);
                ll v = abs(a.c-x);
                if(dir >= esq) update(1,1,n,esq,dir,v);
                if(esq != a.l) aux.pb(triple(a.l,l-1,a.c));
                if(dir != a.r) aux.pb(triple(r+1,a.r,a.c));
                s.erase(it++);
            }
            for (triple a : aux) s.insert(a);
            s.insert(triple(l,r,x));
        } else {
            scanf("%d %d",&l,&r);
            printf("%I64d\n",query(1,1,n,l,r));
        }
    }
}
int main() {
    scanf("%d %d",&n, &d);
    for (int i = 0; i < n; i++) scanf("%d",v+i);
    dp(0,0);
    int ans, cont;
    ans = cont = 0;
    set<int>::iterator it = s.upper_bound(d);
    while(it != s.begin()) {
        it--;
        if(*it == ans) break;
        ans = *it;
        cont++;
        it = s.upper_bound(ans+d);
    }
    printf("%d %d\n",ans,cont);
}
Example #13
0
int main(){
  int T;
  scanf("%d",&T);
  for(int cc = 1 ; cc <= T ; cc++){
    S.clear();
    scanf("%d",&N);
    for(int c = 1 ; c <= N ; c++)
      scanf("%lf",&A[c]);
    for(int c = 1 ; c <= N ; c++){
      scanf("%lf",&B[c]);
      S.insert(B[c]);
    }
    sort(A+1,A+1+N), sort(B+1,B+1+N);
    // for(int c = 1 ; c <= N ; c++)
    //   printf("%lf ",A[c]);
    // printf("\n");
    // for(int c = 1 ; c <= N ; c++)
    //   printf("%lf ",B[c]);
    // printf("\n");
    int s1,s2;
    s1 = s2 = 0;
    for(int c = 1, d = 1 ; c <= N ; c++){
      if(A[c] > B[d])
	s1++,d++;
      set<double>::iterator it = S.upper_bound(A[c]);
      if(it == S.end())
	s2++;
      else
	S.erase(it);
    }
    printf("Case #%d: %d %d\n",cc,s1,s2);
  }
}
Example #14
0
int main() {
	scanf("%d%d%d%d", &n, &p, &q, &r);
	while(n--) {
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		e[p].push_back(make_pair(y, z));
		e[x].push_back(make_pair(q, z));
		e[x].push_back(make_pair(y, r));
	}
	sum = (LL)q * r;
	sp.insert(make_pair(0, r + 1));
	sp.insert(make_pair(q + 1, 0));
	for(int i = p; i >= 1; --i) {
		for(vector<Point>::iterator it = e[i].begin(); it != e[i].end(); ++it) {
			set<Point>::iterator jt = sp.lower_bound(*it), kt; // it -> first <= jt -> first
			if(jt -> second < it -> second) { // new point
				while(1) {
					jt = --sp.upper_bound(*it); // jt -> first <= it -> first
					if(it -> second < jt -> second)
						break;
					Point tp = *jt;
					sp.erase(jt);
					jt = kt = sp.lower_bound(tp);
					sum += (LL)(tp.first - (--jt) -> first) * (tp.second - kt -> second);
				}
				jt = kt = sp.lower_bound(*it);
				sum -= (LL)(it -> first - (--jt) -> first) * (it -> second - kt -> second);
				sp.insert(*it);
			}
		}
		ans += sum;
	}
	printf("%I64d\n", ans);
	return 0;
}
Example #15
0
int main()
{
  ull prod, i, j, T, N;

  for(i=999; i>99; i--)
  for(j=i; j>99; j--)
  {
    prod = i*j;
    if (is_palin(prod))
    {
      palins.insert(prod);
    }
  }

  cin >> T;
  for(i=0; i < T; i++)
  {
    cin >> N;
    si = palins.upper_bound(N);
    si--;
    cout << *si << endl;
  }

  return 0;
}  
Example #16
0
int main () {
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);

        s.clear();
        for (int i = 0; i < n; i++)
            scanf("%d %d", &v[i].second, &v[i].first);
        sort(v, v+n);
        
        for (int i = 0; i < n; i++) {
            a = v[i].second;
            it = s.upper_bound(a);
            if (s.empty() || it == s.begin()) {
                s.insert(a);
            } else {
                it--;
                s.erase(it);
                s.insert(a);
            }
        }
        
        printf("%d\n", s.size());
    }
}
Example #17
0
int main()
{
    while(scanf("%d",&N)==1)
    {
        I.clear();
        D.clear();
        S[0]=0;
        for(int i=1;i<=N;i++)
        {
            scanf("%d",&A[0][i]);
            S[i]=S[i-1]+A[0][i];
        }
        for(int i=1;i<=N;i++)scanf("%d",&A[1][i]);

        I.insert(inter(1,N));
        D.insert(0);D.insert(N+1);
        for(int i=1;i<=N;i++)
        {
            set<int>::iterator R=D.upper_bound(A[1][i]);
            set<int>::iterator L=prev(R);
            //printf("interval to be splitted: %d %d\n",(*L),(*R));
            I.erase(inter((*L)+1,(*R)-1));
            I.insert(inter((*L)+1,A[1][i]-1));
            I.insert(inter(A[1][i]+1,(*R)-1));
            D.insert(A[1][i]);
            //printf("Size: %lu,List of intervals:\n",I.size());
            //for(set<inter>::iterator it=I.begin();it!=I.end();it++)printf("%d %d\n",(*it).l,(*it).r);
            printf("%I64d\n",S[(*I.begin()).r]-S[(*I.begin()).l-1]);
        }
    }
    return 0;
}
Example #18
0
int main(int argc, char* argv[]) {
	ios::sync_with_stdio(false);
	scanf("%d%d%d", &n, &g, &r);
	for (int i = 0; i <= n; ++i)
		scanf("%d", a + i);
	for (int i = n - 1; i >= 0; --i) {
		s[i] = s[i + 1] + a[i];
		lim[i] = -1;
	}
	for (int i = 1; i <= n; ++i) {
		my_insert(s[i - 1], i - 1);
		int p = (s[i] + g - 1) % (g + r);
		it = prt.upper_bound(PLI(p, INF));
		while (it != prt.end() && it->first - p <= r) {
			lim[it->second] = i;
			my_del(it->first, it->second);
			it = prt.upper_bound(PLI(p, INF));
		}
	}
	f[n] = a[n];
	for (int i = n - 1; i >= 0; --i)
		if (lim[i] == -1)
			f[i] = a[n] + s[i];
		else
			f[i] = f[lim[i]] + up(s[i] - s[lim[i]]);
	prt.clear();
	scanf("%d", &q);
	for (int i = 0; i < q; ++i) {
		scanf("%d", t + i);
		my_insert(t[i] + s[0], i);
		ans[i] = -1;
	}
	for (int i = 1; i <= n; ++i) {
		int p = (s[i] + g - 1) % (g + r);
		it = prt.upper_bound(PLI(p, INF));
		while (it != prt.end() && it->first - p <= r) {
			ans[it->second] = f[i] + up(t[it->second] + s[0] - s[i]);
			my_del(it->first, it->second);
			it = prt.upper_bound(PLI(p, INF));
		}
	}
	for (int i = 0; i < q; ++i)
		if (ans[i] == -1)
			cout << s[0] + t[i] + a[n] << endl;
		else
			cout << ans[i] << endl;
}
int main() {

    scanf("%d", &T);
    while (T--) {
        scanf("%d", &N); 
        for (int i = 0; i < N; ++i)
            roof[i].load();
        tot = 0;
        for (int i = 0; i < N; ++i) {
            event[tot++] = Event(i, roof[i].x1, roof[i].y1, 1);
            event[tot++] = Event(i, roof[i].x2, roof[i].y2, -1);
        }
        sort(event, event + tot);
        memset(downto, -1, sizeof(downto));
        memset(ans, 0, sizeof(ans));
        src.clear();
        memset(deg, 0, sizeof(deg));
        S.clear();
        S.insert(event[0].lab);
        Last = event[0].x;
        for (int i = 1; i < tot; ++i) {
            Event now = event[i]; 
            X = now.x;
            if (!S.empty()) 
                ans[*(S.begin())] += X - Last;
            if (now.typ == 1 && roof[now.lab].y1 < roof[now.lab].y2
                    || now.typ == -1 && roof[now.lab].y2 < roof[now.lab].y1) {
                it = S.upper_bound(now.lab);      
                if (it != S.end()) {
                    downto[now.lab] = *it;
                    deg[*it]++;
                }
            }
            if (now.typ == 1) S.insert(now.lab);
            else S.erase(now.lab);
            Last = X;
        }
        for (int i = 0; i < N; ++i) 
            if (deg[i] == 0) src.push_back(i);
        while (!src.empty()) {
            int now = src[(int)src.size() - 1];
            src.pop_back();
            int to = downto[now];
            if (to != -1) {
                ans[to] += ans[now];
                deg[to]--;
                if (deg[to] == 0) src.push_back(to);
            }
        }
        for (int i = 0; i < N; ++i) 
            printf("%d\n", ans[i]);
    }

    return 0;

}
Example #20
0
    int jump(int A[], int n) {
        step.clear(), sum.clear(), can.clear();
        step.resize(n, INT_MAX), sum.resize(n, 0);
        
        int jmp = A[0];
        can.insert(n - 1);
        step[n - 1] = 0;
        
        for (int i = n - 2; i>= 0; i--) {
            jmp = A[i];
            if (i + jmp >= n - 1) {
                sum[i] = sum[i + 1] + 1;
                can.insert(i);
                continue;
            }
            int region = sum[i + 1] - sum[i + jmp + 1];
            if (region > 0) {
                sum[i] = sum[i + 1] + 1;
                can.insert(i);
            } else {
                sum[i] = sum[i + 1];
            }
        }

        if (can.size() > 1 && (jmp >= n-1 || sum[0] - sum[jmp] > 0)) {
            can.insert(0);
        }

        int cur_jmp_to;
        int pre_jmp_to = n-1 + A[n - 1];

        for (int i = n - 2; i >= 0; i--) {
            cur_jmp_to = i + A[i];
            int min_step = INT_MAX;

            if (cur_jmp_to >= pre_jmp_to) {
                min_step = step[i + 1] - 1;
                if (min_step < 0) min_step = 0;
                for (int j = pre_jmp_to; j < n && j <= cur_jmp_to; j++) {
                    if (step[j] < min_step) min_step = step[j];
                }
            } else if (A[i] > 0) {
                set<int>::iterator lower = can.lower_bound(i+1);
                set<int>::iterator upper = can.upper_bound(cur_jmp_to);
                while (lower != upper) {
                    if (step[*lower] < min_step) min_step = step[*lower];
                    lower++;
                }
            }
            step[i] = min_step == INT_MAX ? INT_MAX : min_step + 1;
            pre_jmp_to = cur_jmp_to;
        }
        
        return step[0];
    }
Example #21
0
void solve() {
        scanf("%d", &n);
        for (int i = 1; i <= n; i ++) {
                p[i].scan();
                event[i] = E(p[i].getX(0), p[i].y, i, 0);
                event[n + i] = E(p[i].getX(1), p[i].y, i, 1);
        }
        sort(event + 1, event + 1 + n + n);
        for (int i = 1; i <= n; i ++)
                fa[i] = i;
        for (int i = 1; i <= n + n; i ++) {
                Time = event[i].x;
                if (event[i].flag == 0) {
                        if (ss.empty()) {
                                ss.insert(P(event[i].id, 0));
                                ss.insert(P(event[i].id, 1));
                                add(0, event[i].id);
                                continue;
                        }
                        up = ss.upper_bound(P(event[i].id, 1));
                        dn = ss.lower_bound(P(event[i].id, 0));
                        if (dn == ss.begin() || up == ss.end())
                                add(0, event[i].id);
                        else {
                                dn--;
                                int t1 = up->id;
                                int t2 = dn->id;
                                if (t1 == t2)
                                        add(t1, event[i].id);
                                else if (fa[t1] == fa[t2])
                                        add(fa[t1], event[i].id);
                                else if (fa[t1] == t2)
                                        add(t2, event[i].id);
                                else if (fa[t2] == t1)
                                        add(t1, event[i].id);
                                else
                                        add(0, event[i].id);
                        }
                        ss.insert(P(event[i].id, 0));
                        ss.insert(P(event[i].id, 1));
                } else {
                        ss.erase(ss.find(P(event[i].id, 0)));
                        ss.erase(ss.find(P(event[i].id, 1)));
                }
        }
        for (int i = 1; i <= n; i ++) {
                printf("%d: ", i);
                for (int j = head[i]; ~ j; j = nxt[j])
                        printf("%d ", key[j]);
                printf("\n");
        }
        printf("%s\n", sg(0) ? "Alice" : "Bob");
}
Example #22
0
void add(V x){
	set<V>::iterator p=s.lower_bound(x);//primer elemento mayor o igual
	if(p!=s.end() && p->cost <= x.cost) return;//ya hay uno mejor
	p=s.upper_bound(x);//primer elemento mayor
	if(p!=s.begin()){//borro todos los peores (<=beneficio  y >=costo)
		--p;//ahora es ultimo elemento menor o igual
		while(p->cost >= x.cost){
			if(p==s.begin()){s.erase(p); break;}
			s.erase(p--);
		}
	}
	s.insert(x);
}
Example #23
0
int main() {
    int n;
    scanf("%d", &n);

    int x;
    scanf("%d", &x);

    values.insert(x);
    neg_values.insert(-x);

    for (int i = 1; i < n; ++i) {
        scanf("%d", &x);
        // handle the edge cases
        if (x < *values.begin()) {
            full_left.insert(*values.begin());
            printf("%d ", *values.begin());
        } else if (x > *values.rbegin()) {
            full_right.insert(*values.rbegin());
            printf("%d ", *values.rbegin());
        } else {
            // find the nodes surrounding x
            int lower = -1 * (*neg_values.upper_bound(-x));
            int upper = *values.upper_bound(x);
            
            // printf("%d %d %d\n", lower, x, upper);
            assert(full_right.count(lower) ^ full_left.count(upper));
            if (full_right.find(lower) == full_right.end()) {
                full_right.insert(lower);
                printf("%d ", lower);
            } else {
                full_left.insert(upper);
                printf("%d ", upper);
            }
        }

        values.insert(x);
        neg_values.insert(-x);
    }
}
Example #24
0
int main()
{
   lli a,b;
   gen_lucky();
   cin >> a >> b;
   lli total = 0;
   std::set<lli>::iterator it,it2;
   //lli c = 0, d = 0;
   if(a == b)
   {
      if(lucky.count(a) == 0)
      {
         it = lucky.upper_bound(a);
         cout<<*it<<endl;
      }
      else cout<<a<<endl;
      return 0;
   }   
   for(it = lucky.begin(); it != lucky.end(); it++)
   {
      if(a <= *it){
         total += (((*it)-a)+1)*(*it);
         //cout<<total<<endl;
         std::set<lli>::iterator itx = it;
         itx++;
         for(it2 = itx; it2 != lucky.end(); it2++)
         {
            std::set<lli>::iterator itx2 = it2;
            //cout<<*it2<<endl;
            if( b <= *it2 )
            {   
               //cout<<"paso1"<<endl;         
               if(b <= *it)
               {
                   total -= ((*it - b))*(*it);
                   break;
               }
               lli tmp = (b - *(--itx2))*(*it2);
               total += tmp;
               //cout<<total<<endl;
               break;
            }
            //cout<<"paso2"<<endl;
            total += (*(it2) - *(--itx2))*(*it2);
         }
         break;
      }
    }
    cout<<total<<endl;
    return 0;  
}
Example #25
0
 forn(i, n) {
     int numi = order[i].se;
     dp[numi] = points[numi];
     i64 maxx = 0;
     auto lowerx = S.lower_bound(numi);
     auto upperx = S.upper_bound(numi);
     for (auto iter = lowerx; iter != upperx; ++iter) {
             int numj = (*iter);
             if (h[numj] < h[numi] && abs(y[numj] - y[numi]) <= dy)
                 maxx = max(maxx, dp[numj]);
     }
     dp[numi] += maxx;
     S.insert(numi);
 }
Example #26
0
int findMinDays(int n, int k, int a[])
{
    for (int i=0; i<n; i++) { if (a[i]) s.insert(i); }
    int day = 0, cur = 0;
    while (cur != n-1) {
        it = s.upper_bound(cur+k);
        it--;
        if (*it == cur) { day = -1; break; }
        cur = *it;
        day++;
    }
    //cout << day << endl;
	return day;
}
Example #27
0
int main()
{
    string line;
    //build library
    while(getline(cin,line),line!="END"){
        int p = line.find(" by ");
        Book book;
        string title = line.substr(0,p);
        string author = line.substr(p+4);
        book.title = title;
        book.author = author;
        title_to_book[title] = book;
        library.insert(book);
    }
    while(getline(cin,line),line!="END"){
        string title;
        if(line.substr(0,6)=="BORROW"){
            title = line.substr(7);
            library.erase(title_to_book[title]);
        }else if(line.substr(0,6)=="RETURN"){
            title = line.substr(7);
            desk.insert(title_to_book[title]);
        }else{
            //shelve
            for(set<Book>::reverse_iterator it=desk.rbegin();it!=desk.rend();it++){
                cout<<"Put "<<it->title;
                if(library.upper_bound(*it)==library.end()) cout<<" first"<<endl;
                else cout<<" after "<<library.upper_bound(*it)->title<<endl;
                library.insert(*it);
            }
            cout<<"END"<<endl;
            desk.clear();
        }
    }
    return 0;
}
int main(){
	null=&nul;
	for(int j=0;j<logN;j++) null->next[j]=null;
	null->st=-2*inf;
	null->en=2*inf;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d%d",&a[i].st,&a[i].en);
		ord[i]=a+i;
	}
	sort(ord,ord+n,cmp);
	for(int i=0;i<n;i++) ord[i]->ok=1;
	for(int i=n-1,now=inf;i>=0;i--){
		if(now<=ord[i]->en){
			ord[i]->ok=0;
		}
		else
			now=ord[i]->en;
	}
	for(int i=0;i<n;i++) if(ord[i]->ok) ord2[m++]=ord[i];
	ord2[m]=null;
	for(int i=m-1;i>=0;i--){
		data tmp;
		tmp.st=ord2[i]->en+1;
		tmp.en=inf;
		ord2[i]->next[0]=*lower_bound(ord2+i,ord2+m,&tmp,cmp);
		for(int j=1;j<logN;j++)
			ord2[i]->next[j]=ord2[i]->next[j-1]->next[j-1];
	}
	for(data *u=ord2[0];u!=null;u=u->next[0]) ans++;
	printf("%d\n",ans);
	s.insert(pii(-inf,inf));
	for(int i=0;i<n;i++){
		set<pii>::iterator j=s.upper_bound(pii(a[i].st,inf));
		if(j==s.begin()) continue;
		j--;
		pii t=*j;
		if(t.second<a[i].en) continue;
		if(calc(t.first,a[i].st-1)+1+calc(a[i].en+1,t.second)==calc(t.first,t.second)){
			printf("%d ",i+1);
			s.erase(j);
			s.insert(pii(t.first,a[i].st-1));
			s.insert(pii(a[i].en+1,t.second));
		}
	}
	puts("");
}
Example #29
0
File: main.cpp Project: riteme/test
void construct_tree() {
    sorted.insert(x[1]);

    for (int i = 2; i <= n; i++) {
        int u = x[i];
        auto iter = sorted.upper_bound(u);

        if (iter == sorted.end())
            iter = prev(iter);
        else if (prev(iter) != sorted.end() &&
                 timestamp[*iter] < timestamp[*prev(iter)])
            iter--;

        G[*iter].push_back(u);
        timestamp[u] = i;
        sorted.insert(u);
    }  // for
}
Example #30
0
File: p2520.cpp Project: csimstu/OI
void dfs(int x) {
    dfn[x] = low[x] = time_stamp ++;
    stk[top ++] = x;
    in_stk[x] = true;
    sgt::set(x, dfn[x]);
    vis.erase(vis.lower_bound(x));

    int pre = -1;
    while ( 1 ) {
        set<int>::iterator it;
        if ( pre == -1 )
            it = vis.lower_bound(mine[x].l);
        else
            it = vis.upper_bound(pre);

        if ( it == vis.end() || *it > mine[x].r ) {
            if ( pre == -1 )
                low[x] = min(low[x], sgt::ask(mine[x].l, mine[x].r));
            else
                low[x] = min(low[x], sgt::ask(pre + 1, mine[x].r));
            break;
        }
        if ( pre == -1 )
            low[x] = min(low[x], sgt::ask(mine[x].l, *it));
        else
            low[x] = min(low[x], sgt::ask(pre + 1, *it));
        dfs(*it);
        low[x] = min(low[x], low[*it]);
        pre = *it;
    }

    if ( low[x] == dfn[x] ) {
        while ( 1 ) {
            int u = stk[-- top];
            bel[u] = n_scc;
            in_stk[u] = false;
            scc[n_scc].push_back(u);
            sgt::set(u, inf);
            if ( u == x )
                break;
        }
        n_scc ++;
    }
}