#include<bits/stdc++.h>
#define ll long long
using namespace std;
class node
{
public :
ll pre,suff ,ans;
ll has_0;
node()
{
pre = suff = ans = has_0 = 0;
}
};
void build(node *tree,ll *a,ll tree_index,ll start,ll end)
{
if(start>end)
return;
if(start == end)
{
//a[start] == 1 ? tree[tree_index].has_0=0,pre=suff=ans=1 ? tree[tree_index].has_0=1,pre=suff=ans=0;
if(a[start] == 1)
{
tree[tree_index].has_0 = 0;
tree[tree_index].pre = 1;
tree[tree_index].suff = 1;
tree[tree_index].ans = 1;
}
else
{
tree[tree_index].has_0 = 1;
tree[tree_index].pre = 0;
tree[tree_index].suff = 0;
tree[tree_index].ans = 0;
}
//cout<<tree_index<<" "<<start<<" "<<tree[tree_index].ans<<endl;
return;
}
ll mid = start + end;
mid >>= 1;
build(tree,a,2*tree_index,start,mid);
build(tree,a,2*tree_index+1,mid+1,end);
// for parent has_0
if(tree[2*tree_index].has_0 == 1 || tree[2*tree_index + 1].has_0 == 1)
tree[tree_index].has_0 = 1;
else if(tree[2*tree_index].has_0 == 0 && tree[2*tree_index + 1].has_0 == 0)
{
// 1. Both do not contain 0
tree[tree_index].has_0 = 0;
tree[tree_index].pre = tree[tree_index].suff = tree[tree_index].ans = end-start+1;
return;
}
// 2. if left child contains 0
if(tree[2*tree_index].has_0 == 1 && tree[2*tree_index+1].has_0 == 0)
{
tree[tree_index].pre = tree[2*tree_index].pre;
tree[tree_index].suff = tree[2*tree_index].suff + end - mid;
tree[tree_index].ans = max(tree[tree_index].suff, max(tree[2*tree_index].ans , tree[2*tree_index+1].ans));
return;
}
// 3. if right child contains 0
if(tree[2*tree_index].has_0 == 1 && tree[2*tree_index+1].has_0 == 0)
{
tree[tree_index].pre = tree[2*tree_index+1].pre + mid - start + 1;
tree[tree_index].suff = tree[2*tree_index+1].suff;
tree[tree_index].ans = max(tree[tree_index].pre, max(tree[2*tree_index].ans , tree[2*tree_index+1].ans));
return;
}
// 4. if both contains 0
tree[tree_index].pre = tree[2*tree_index].pre;
tree[tree_index].suff = tree[2*tree_index+1].suff;
tree[tree_index].ans = max(tree[2*tree_index].suff+tree[2*tree_index+1].pre,max(tree[2*tree_index].ans,tree[2*tree_index+1].ans));
}
//its returning the answer but have to return a node
/*
ll query(node *tree,ll tree_index,ll start,ll end,ll query_start,ll query_end)
{
// 1. No overlap
if(start > query_end || end < query_start)
return minv;
// 2. Complete overlap
if(start >= query_start && end <= query_end)
{
return tree[tree_index].ans;
}
ll mid = start + end;
mid >>= 1;
ll leftans = query(tree,2*tree_index,start,mid, query_start,query_end);
ll rightans = query(tree,2*tree_index + 1,mid+1,end, query_start,query_end);
// merge answer :(
ll mergeans = 1; //???
//return max(merge_ans,max(leftans,rightans));
return max(mergeans, max(leftans,rightans));
}*/
node query(node *tree,ll tree_index,ll start,ll end,ll query_start,ll query_end)
{
node a,b,c;
if(query_end < start || end < query_start)
{
a.ans = a.pre = a.suff = 0;
a.has_0 = 100;
return a;
}
if(query_start <= start && query_end >= end)
{
return tree[tree_index];
}
ll mid = start + end;
mid >>= 1;
b = query(tree,2*tree_index,start,mid,query_start,query_end);
c = query(tree,2*tree_index+1,mid+1,end,query_start,query_end);
if(b.has_0 == 100)
{
//cout<<"left cut :) ";
return c;
}
if(c.has_0 == 100)
{
//cout<<"right cut :) ";
return b;
}
// yeah i know its wrong
// but can't figure it out what to do :(
// .....
// both don't contain 0
if(b.has_0 == 0 && c.has_0 == 0)
{
a.has_0 = 0;
a.pre = a.suff = a.ans = b.ans + c.ans;
return a;
}
// if left contains 0
if(b.has_0 == 1 && c.has_0 == 0)
{
a.has_0 = 1;
a.pre = b.pre;
a.suff = b.suff + c.suff;
a.ans = max(b.ans , max(c.ans , b.suff+c.pre));
return a;
}
// if right contains 0
if(b.has_0 == 0 && c.has_0 == 1)
{
a.has_0 = 1;
a.pre = b.pre + c.pre;
a.suff = c.suff;
a.ans = max(b.ans , max(c.ans , b.suff + c.pre));
return a;
}
// if both contains 0
a.has_0 = 1;
a.pre = b.pre;
a.suff = c.suff;
a.ans = max(b.ans , max(c.ans , b.suff + c.pre));
return a;
}
int main()
{
ll n,i,j,x,y,q,k,val;
cin>>n>>q>>k;
ll xr[n] = {0};
for(i = 0;i<n;i++)
cin>>xr[i];
reverse(xr,xr+n);
ll a[2*n] = {0};
for(i = 0;i<n;i++)
{
a[i] = a[i+n] = xr[i];
}
for(i = 0;i<n;i++)
{
a[i] = a[i+n] = xr[i];
//cout<<xr[i]<<" ";
}
//for(i = 0;i<2*n;i++)
//cout<<a[i]<<" ";
node tree[8*n+4];
build(tree,a,1,0,2*n-1);
//for(i = 1;i<=26;i++)
//cout<<i<<"\t"<<tree[i].ans<<"\t"<<tree[i].pre<<"\t"<<tree[i].suff<<"\t"<<tree[i].has_0<<endl;
j = 2*n-1;
/*while(1)
{
cin>>j>>val;
//cout<<j<<" ";
node node1 = query(tree,1,0,2*n-1, j,val);
cout<<j<<" "<<val<<" "<<node1.ans<<" "<<node1.pre<<" "<<node1.suff<<endl;
//j++;
}*/
string que = "";
cin>>que;
i = 0;
j = 0;
for(i = 0;i<que.length();i++)
{
if(que[i] == '!')
{
j++;
if(j == n)
j = 0;
}
//cout<<x<<" "<<y<<"\t";
else
{
val = query(tree,1,0,2*n-1, j,j+n-1).ans;
cout<<min(val,k)<<endl;
}
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY2xhc3Mgbm9kZQp7CglwdWJsaWMgOiAKCWxsIHByZSxzdWZmICxhbnM7CglsbCBoYXNfMDsKCW5vZGUoKQoJewoJCXByZSA9IHN1ZmYgPSBhbnMgPSBoYXNfMCA9IDA7Cgl9Cn07CnZvaWQgYnVpbGQobm9kZSAqdHJlZSxsbCAqYSxsbCB0cmVlX2luZGV4LGxsIHN0YXJ0LGxsIGVuZCkKewoJaWYoc3RhcnQ+ZW5kKQoJcmV0dXJuOwoJaWYoc3RhcnQgPT0gZW5kKQoJewoJCQoJCS8vYVtzdGFydF0gPT0gMSA/IHRyZWVbdHJlZV9pbmRleF0uaGFzXzA9MCxwcmU9c3VmZj1hbnM9MSA/IHRyZWVbdHJlZV9pbmRleF0uaGFzXzA9MSxwcmU9c3VmZj1hbnM9MDsKCQlpZihhW3N0YXJ0XSA9PSAxKQoJCXsKCQkJdHJlZVt0cmVlX2luZGV4XS5oYXNfMCA9IDA7CgkJCXRyZWVbdHJlZV9pbmRleF0ucHJlID0gMTsKCQkJdHJlZVt0cmVlX2luZGV4XS5zdWZmID0gMTsKCQkJdHJlZVt0cmVlX2luZGV4XS5hbnMgPSAxOwoJCX0KCQllbHNlCgkJewoJCQl0cmVlW3RyZWVfaW5kZXhdLmhhc18wID0gMTsKCQkJdHJlZVt0cmVlX2luZGV4XS5wcmUgPSAwOwoJCQl0cmVlW3RyZWVfaW5kZXhdLnN1ZmYgPSAwOwoJCQl0cmVlW3RyZWVfaW5kZXhdLmFucyA9IDA7CgkJfQoJCS8vY291dDw8dHJlZV9pbmRleDw8IiAiPDxzdGFydDw8IiAiPDx0cmVlW3RyZWVfaW5kZXhdLmFuczw8ZW5kbDsKCQlyZXR1cm47CQoJfQoJbGwgbWlkID0gc3RhcnQgKyBlbmQ7CgltaWQgPj49IDE7CgkKCWJ1aWxkKHRyZWUsYSwyKnRyZWVfaW5kZXgsc3RhcnQsbWlkKTsKCWJ1aWxkKHRyZWUsYSwyKnRyZWVfaW5kZXgrMSxtaWQrMSxlbmQpOwoJCgkvLyBmb3IgcGFyZW50IGhhc18wCglpZih0cmVlWzIqdHJlZV9pbmRleF0uaGFzXzAgPT0gMSB8fCB0cmVlWzIqdHJlZV9pbmRleCArIDFdLmhhc18wID09IDEpCgl0cmVlW3RyZWVfaW5kZXhdLmhhc18wID0gMTsKCWVsc2UgaWYodHJlZVsyKnRyZWVfaW5kZXhdLmhhc18wID09IDAgJiYgdHJlZVsyKnRyZWVfaW5kZXggKyAxXS5oYXNfMCA9PSAwKQoJewoJCS8vIDEuIEJvdGggZG8gbm90IGNvbnRhaW4gMAoJCQoJCXRyZWVbdHJlZV9pbmRleF0uaGFzXzAgPSAwOwoJCXRyZWVbdHJlZV9pbmRleF0ucHJlID0gdHJlZVt0cmVlX2luZGV4XS5zdWZmID0gdHJlZVt0cmVlX2luZGV4XS5hbnMgPSBlbmQtc3RhcnQrMTsKCQlyZXR1cm47Cgl9CgkKCS8vIDIuIGlmIGxlZnQgY2hpbGQgY29udGFpbnMgMAoJaWYodHJlZVsyKnRyZWVfaW5kZXhdLmhhc18wID09IDEgJiYgdHJlZVsyKnRyZWVfaW5kZXgrMV0uaGFzXzAgPT0gMCkKCXsKCQl0cmVlW3RyZWVfaW5kZXhdLnByZSA9IHRyZWVbMip0cmVlX2luZGV4XS5wcmU7CgkJdHJlZVt0cmVlX2luZGV4XS5zdWZmID0gdHJlZVsyKnRyZWVfaW5kZXhdLnN1ZmYgKyBlbmQgLSBtaWQ7CgkJdHJlZVt0cmVlX2luZGV4XS5hbnMgPSBtYXgodHJlZVt0cmVlX2luZGV4XS5zdWZmLCBtYXgodHJlZVsyKnRyZWVfaW5kZXhdLmFucyAsIHRyZWVbMip0cmVlX2luZGV4KzFdLmFucykpOwkKCQlyZXR1cm47CQoJfQoJCgkvLyAzLiBpZiByaWdodCBjaGlsZCBjb250YWlucyAwCglpZih0cmVlWzIqdHJlZV9pbmRleF0uaGFzXzAgPT0gMSAmJiB0cmVlWzIqdHJlZV9pbmRleCsxXS5oYXNfMCA9PSAwKQoJewoJCXRyZWVbdHJlZV9pbmRleF0ucHJlID0gdHJlZVsyKnRyZWVfaW5kZXgrMV0ucHJlICsgbWlkIC0gc3RhcnQgKyAxOwoJCXRyZWVbdHJlZV9pbmRleF0uc3VmZiA9IHRyZWVbMip0cmVlX2luZGV4KzFdLnN1ZmY7CgkJdHJlZVt0cmVlX2luZGV4XS5hbnMgPSBtYXgodHJlZVt0cmVlX2luZGV4XS5wcmUsIG1heCh0cmVlWzIqdHJlZV9pbmRleF0uYW5zICwgdHJlZVsyKnRyZWVfaW5kZXgrMV0uYW5zKSk7CQoJCXJldHVybjsJCgl9CgkKCS8vIDQuIGlmIGJvdGggY29udGFpbnMgMAoJdHJlZVt0cmVlX2luZGV4XS5wcmUgPSB0cmVlWzIqdHJlZV9pbmRleF0ucHJlOwoJdHJlZVt0cmVlX2luZGV4XS5zdWZmID0gdHJlZVsyKnRyZWVfaW5kZXgrMV0uc3VmZjsKCXRyZWVbdHJlZV9pbmRleF0uYW5zID0gbWF4KHRyZWVbMip0cmVlX2luZGV4XS5zdWZmK3RyZWVbMip0cmVlX2luZGV4KzFdLnByZSxtYXgodHJlZVsyKnRyZWVfaW5kZXhdLmFucyx0cmVlWzIqdHJlZV9pbmRleCsxXS5hbnMpKTsKCQp9Ci8vaXRzIHJldHVybmluZyB0aGUgYW5zd2VyIGJ1dCBoYXZlIHRvIHJldHVybiBhIG5vZGUKLyoKbGwgcXVlcnkobm9kZSAqdHJlZSxsbCB0cmVlX2luZGV4LGxsIHN0YXJ0LGxsIGVuZCxsbCBxdWVyeV9zdGFydCxsbCBxdWVyeV9lbmQpCnsKCS8vIDEuIE5vIG92ZXJsYXAKCWlmKHN0YXJ0ID4gcXVlcnlfZW5kIHx8IGVuZCA8IHF1ZXJ5X3N0YXJ0KQoJcmV0dXJuIG1pbnY7CgkKCS8vIDIuIENvbXBsZXRlIG92ZXJsYXAKCWlmKHN0YXJ0ID49IHF1ZXJ5X3N0YXJ0ICYmIGVuZCA8PSBxdWVyeV9lbmQpCgl7CgkJcmV0dXJuIHRyZWVbdHJlZV9pbmRleF0uYW5zOwoJfQoJbGwgbWlkID0gc3RhcnQgKyBlbmQ7CgltaWQgPj49IDE7CglsbCBsZWZ0YW5zID0gcXVlcnkodHJlZSwyKnRyZWVfaW5kZXgsc3RhcnQsbWlkLCBxdWVyeV9zdGFydCxxdWVyeV9lbmQpOwoJbGwgcmlnaHRhbnMgPSBxdWVyeSh0cmVlLDIqdHJlZV9pbmRleCArIDEsbWlkKzEsZW5kLCBxdWVyeV9zdGFydCxxdWVyeV9lbmQpOwoJCgkKCS8vIG1lcmdlIGFuc3dlciA6KAoJbGwgbWVyZ2VhbnMgPSAxOyAgICAvLz8/PyAgCgkvL3JldHVybiBtYXgobWVyZ2VfYW5zLG1heChsZWZ0YW5zLHJpZ2h0YW5zKSk7CglyZXR1cm4gbWF4KG1lcmdlYW5zLCBtYXgobGVmdGFucyxyaWdodGFucykpOwoJCn0qLwpub2RlIHF1ZXJ5KG5vZGUgKnRyZWUsbGwgdHJlZV9pbmRleCxsbCBzdGFydCxsbCBlbmQsbGwgcXVlcnlfc3RhcnQsbGwgcXVlcnlfZW5kKQp7Cglub2RlIGEsYixjOwoJCglpZihxdWVyeV9lbmQgPCBzdGFydCB8fCBlbmQgPCBxdWVyeV9zdGFydCkKCXsKCQlhLmFucyA9IGEucHJlID0gYS5zdWZmID0gMDsKCQlhLmhhc18wID0gMTAwOwoJCXJldHVybiBhOwoJfQoJCgkKCWlmKHF1ZXJ5X3N0YXJ0IDw9IHN0YXJ0ICYmIHF1ZXJ5X2VuZCA+PSBlbmQpCgl7CgkJcmV0dXJuIHRyZWVbdHJlZV9pbmRleF07CQkKCX0KCQoJbGwgbWlkID0gc3RhcnQgKyBlbmQ7CgltaWQgPj49IDE7CgkKCQoJYiA9IHF1ZXJ5KHRyZWUsMip0cmVlX2luZGV4LHN0YXJ0LG1pZCxxdWVyeV9zdGFydCxxdWVyeV9lbmQpOwoJCgljID0gcXVlcnkodHJlZSwyKnRyZWVfaW5kZXgrMSxtaWQrMSxlbmQscXVlcnlfc3RhcnQscXVlcnlfZW5kKTsKCQoJaWYoYi5oYXNfMCA9PSAxMDApCgl7CgkJLy9jb3V0PDwibGVmdCBjdXQgOikgICI7CgkJcmV0dXJuIGM7Cgl9CglpZihjLmhhc18wID09IDEwMCkKCXsKCQkvL2NvdXQ8PCJyaWdodCBjdXQgOikgICI7CgkJcmV0dXJuIGI7Cgl9CgkKCS8vIHllYWggaSBrbm93IGl0cyB3cm9uZyAKCS8vIGJ1dCBjYW4ndCBmaWd1cmUgaXQgb3V0IHdoYXQgdG8gZG8gOigKCS8vIC4uLi4uCgkKCS8vIGJvdGggZG9uJ3QgY29udGFpbiAwCglpZihiLmhhc18wID09IDAgJiYgYy5oYXNfMCA9PSAwKQoJewoJCWEuaGFzXzAgPSAwOwoJCWEucHJlID0gYS5zdWZmID0gYS5hbnMgPSBiLmFucyArIGMuYW5zOwoJCXJldHVybiBhOwoJfQoJCgkvLyBpZiBsZWZ0IGNvbnRhaW5zIDAKCWlmKGIuaGFzXzAgPT0gMSAmJiBjLmhhc18wID09IDApCgl7CgkJYS5oYXNfMCA9IDE7CgkJYS5wcmUgPSBiLnByZTsKCQlhLnN1ZmYgPSBiLnN1ZmYgKyBjLnN1ZmY7CgkJYS5hbnMgPSBtYXgoYi5hbnMgLCBtYXgoYy5hbnMgLCBiLnN1ZmYrYy5wcmUpKTsKCQlyZXR1cm4gYTsKCX0KCQoJLy8gaWYgcmlnaHQgY29udGFpbnMgMAoJaWYoYi5oYXNfMCA9PSAwICYmIGMuaGFzXzAgPT0gMSkKCXsKCQlhLmhhc18wID0gMTsKCQlhLnByZSA9IGIucHJlICsgYy5wcmU7CgkJYS5zdWZmID0gYy5zdWZmOwoJCWEuYW5zID0gbWF4KGIuYW5zICwgbWF4KGMuYW5zICwgYi5zdWZmICsgYy5wcmUpKTsKCQlyZXR1cm4gYTsKCX0KCQoJLy8gaWYgYm90aCBjb250YWlucyAwCglhLmhhc18wID0gMTsKCWEucHJlID0gYi5wcmU7CglhLnN1ZmYgPSBjLnN1ZmY7CglhLmFucyA9IG1heChiLmFucyAsIG1heChjLmFucyAsIGIuc3VmZiArIGMucHJlKSk7CglyZXR1cm4gYTsKfQppbnQgbWFpbigpCnsKCWxsIG4saSxqLHgseSxxLGssdmFsOwoJY2luPj5uPj5xPj5rOwoJCglsbCB4cltuXSA9IHswfTsKCWZvcihpID0gMDtpPG47aSsrKQoJCWNpbj4+eHJbaV07CglyZXZlcnNlKHhyLHhyK24pOwoJbGwgIGFbMipuXSA9IHswfTsKCWZvcihpID0gMDtpPG47aSsrKQoJewoJCWFbaV0gPSBhW2krbl0gPSB4cltpXTsKCX0KCWZvcihpID0gMDtpPG47aSsrKQoJewoJCWFbaV0gPSBhW2krbl0gPSB4cltpXTsKCQkvL2NvdXQ8PHhyW2ldPDwiICI7Cgl9CgkvL2ZvcihpID0gMDtpPDIqbjtpKyspCgkvL2NvdXQ8PGFbaV08PCIgIjsKCW5vZGUgdHJlZVs4Km4rNF07CglidWlsZCh0cmVlLGEsMSwwLDIqbi0xKTsKCS8vZm9yKGkgPSAxO2k8PTI2O2krKykKCS8vY291dDw8aTw8Ilx0Ijw8dHJlZVtpXS5hbnM8PCJcdCI8PHRyZWVbaV0ucHJlPDwiXHQiPDx0cmVlW2ldLnN1ZmY8PCJcdCI8PHRyZWVbaV0uaGFzXzA8PGVuZGw7CglqID0gMipuLTE7CgkKCQoJLyp3aGlsZSgxKQoJewoJCWNpbj4+aj4+dmFsOwoJCS8vY291dDw8ajw8IiAiOwoJCQoJCW5vZGUgbm9kZTEgPSBxdWVyeSh0cmVlLDEsMCwyKm4tMSwgaix2YWwpOwoJCQoJCWNvdXQ8PGo8PCIgIjw8dmFsPDwiICI8PG5vZGUxLmFuczw8IiAiPDxub2RlMS5wcmU8PCIgIjw8bm9kZTEuc3VmZjw8ZW5kbDsKCQkvL2orKzsKCX0qLwoJCgkKCXN0cmluZyBxdWUgPSAiIjsKCWNpbj4+cXVlOwoJaSA9IDA7CglqID0gMDsKCWZvcihpID0gMDtpPHF1ZS5sZW5ndGgoKTtpKyspCgl7CgkJCgkJaWYocXVlW2ldID09ICchJykKCQl7CgkJCWorKzsKCQkJaWYoaiA9PSBuKQoJCQkJaiA9IDA7CgkJCQoJCX0KCQoJCS8vY291dDw8eDw8IiAiPDx5PDwiXHQiOwoJCWVsc2UKCQl7CgkJCXZhbCA9IHF1ZXJ5KHRyZWUsMSwwLDIqbi0xLCBqLGorbi0xKS5hbnM7CgkJCWNvdXQ8PG1pbih2YWwsayk8PGVuZGw7CgkJfQoJCQoJCQoJfQoJCgkKCQp9