Submission #559811

#TimeUsernameProblemLanguageResultExecution timeMemory
559811jeqcho가로등 (APIO19_street_lamps)C++17
20 / 100
259 ms14056 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long double ld;
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pair<int,int>> vpi;

#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i,a) ROF(i,0,a)
#define trav(a,x) for (auto& a: x)

#define pb push_back
#define rsz resize
#define sz(x) int(x.size())
#define all(x) begin(x), end(x)
#define fi first
#define se second

//int const N=3e5+3;
//int const K=18+3;
int const INF=1e9;

template<class T>
struct segmentTree
{
    vector<T> seg;
    int arr_sz;
    T init_value = 0;
    // sum 0
    // min 1e9+3
    // max -(1e9+3)
    
    T comb(T a, T b)
    {
        //return a+b;
        //return min(a,b);
        return max(a,b);
        
    }
    void init(int n, vector<T> &arr)
    {
        int p2 = ceil(log2((long double)n));
        arr_sz = 1<<p2;
        int tree_sz = 2*arr_sz;
        seg.rsz(tree_sz);
        fill(all(seg),init_value);
        F0R(i,n)
        {
            seg[arr_sz-1 + i]=arr[i];
        }
        build(0,0,arr_sz);
    }

    T build(int idex, int lx, int rx)
    {
        if(lx==rx-1)return seg[idex];
        seg[idex] = comb(build(2*idex+1, lx,(lx+rx)/2 ), build(2*idex+2, (lx+rx)/2,rx));
        return seg[idex];
    }

    void update(int idex, T val)
    {
        idex += arr_sz-1;
        seg[idex] = val;
        while(idex>0)
        {
			--idex;
            idex /= 2;
            seg[idex] = comb(seg[2*idex+1], seg[2*idex+2]);
           
        }
    }
    
    T query(int l, int r)
    {
        return query(0,l,r,0,arr_sz);
    }

    T query(int idex, int lq, int rq, int lx, int rx)
    {
        if(lx>=lq&&rx<=rq)return seg[idex];
        else if(lx>=rq||rx<=lq) return init_value;
        else
        {
            return comb(query(2*idex+1,lq,rq, lx,(lx+rx)/2 ), query(2*idex+2,lq,rq, (lx+rx)/2,rx));
        }
    }
};

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	int n,q;
	cin>>n>>q;
	string s;
	cin>>s;
	segmentTree<int> seg;
	vi v(n,INF);
	
	F0R(i,n)if(s[i]=='1')v[i]=0;
	seg.init(n,v);
	F0R(p,q)
	{
		string t;
		cin>>t;
		if(t=="toggle")
		{
			int i;
			cin>>i;
			--i;
			seg.update(i,p+1);
		}
		else
		{
			int a,b;
			cin>>a>>b;
			--a;--b;
			int ans=p+1-seg.query(a,b);
			ans=max(ans,0);
			cout<<ans<<'\n';
		}
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...