#include
#include
#include
using namespace std;
const int N = 1e5+5;
int n,m;
int cnt,s[N],e[N];
///vector g[N];(超时)
vector > g(N);
void dfs(int fa,int x) {
s[x]=++cnt;
for(int i=0;i=r) return sum[o];
int m=(l+r)/2;
if(qr<=m) return qu(2*o,l,m,ql,qr);
else if(ql>m) return qu(2*o+1,m+1,r,ql,qr);
else return qu(2*o,l,m,ql,qr)+qu(2*o+1,m+1,r,ql,qr);
}
int main() {
scanf("%d",&n);
for(int i=1;i
#include
using namespace std;
#define ll long long
#define EF if(ch==EOF) return x;
#define lc o<<1
#define rc o<<1|1
const int N=1e6+5;
int T,n,m,a[N];
ll mx[4*N],sum[4*N],se[4*N],cnt[4*N];
bool lz[4*N];
int read() {
int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void pd(int o) {
if(lz[o]) {
if(mx[2*o]>mx[o]) {
lz[2*o]=1;
sum[2*o]-=cnt[2*o]*(mx[2*o]-mx[o]);
mx[2*o]=mx[o];
}
if(mx[2*o+1]>mx[o]) {
lz[2*o+1]=1;
sum[2*o+1]-=cnt[2*o+1]*(mx[2*o+1]-mx[o]);
mx[2*o+1]=mx[o];
}
lz[o]=0;
}
}
void pu(int o) {
mx[o]=max(mx[2*o],mx[2*o+1]);
sum[o]=sum[2*o]+sum[2*o+1];
if(mx[2*o]==mx[2*o+1]) se[o]=max(se[2*o],se[2*o+1]),cnt[o]=cnt[2*o]+cnt[2*o+1];
else if(mx[2*o]>mx[2*o+1]) se[o]=max(se[2*o],mx[2*o+1]),cnt[o]=cnt[2*o];
else se[o]=max(se[2*o+1],mx[2*o]),cnt[o]=cnt[2*o+1];
}
void bd(int o,int l,int r) {
lz[o]=0;
if(l==r) {
mx[o]=sum[o]=a[l];
se[o]=-1;
cnt[o]=1;
return ;
}
int m=(l+r)/2;
bd(2*o,l,m);
bd(2*o+1,m+1,r);
pu(o);
}
void up(int o,int l,int r,int ql,int qr,int x) {
if(mx[o]<=x) return ;
if(ql<=l&&qr>=r) {
if(se[o]m) up(2*o+1,m+1,r,ql,qr,x);
else {
up(2*o,l,m,ql,qr,x);
up(2*o+1,m+1,r,ql,qr,x);
}
pu(o);
}
ll qumax(int o,int l,int r,int ql,int qr) {
if(ql<=l&&qr>=r) return mx[o];
pd(o);
int m=(l+r)/2;
if(qr<=m) return qumax(2*o,l,m,ql,qr);
else if(ql>m) return qumax(2*o+1,m+1,r,ql,qr);
else return max(qumax(2*o,l,m,ql,m),qumax(2*o+1,m+1,r,m+1,qr));
}
ll qusum(int o,int l,int r,int ql,int qr) {
if(ql<=l&&qr>=r) return sum[o];
pd(o);
int m=(l+r)/2;
if(qr<=m) return qusum(2*o,l,m,ql,qr);
else if(ql>m) return qusum(2*o+1,m+1,r,ql,qr);
else return qusum(2*o,l,m,ql,m)+qusum(2*o+1,m+1,r,m+1,qr);
}
int main() {
T=read();
while(T--) {
n=read(),m=read();
for(register int i=1;i<=n;i++) a[i]=read();
bd(1,1,n);
for(register int i=1;i<=m;i++) {
int op,l,r,t;
op=read(),l=read(),r=read();
if(op==0) {
t=read();
up(1,1,n,l,r,t);
}
else if(op==1) printf("%lld\n",qumax(1,1,n,l,r));
else printf("%lld\n",qusum(1,1,n,l,r));
}
}
return 0;
}
#include
using namespace std;
#define ll long long
const int N=1e5+5;
int n,m,a[N];
ll mx[4*N],sum[4*N];
void bd(int o,int l,int r) {
if(l==r) {
sum[o]=mx[o]=a[l];
return ;
}
int m=(l+r)/2;
bd(2*o,l,m);
bd(2*o+1,m+1,r);
mx[o]=max(mx[2*o],mx[2*o+1]);
sum[o]=sum[2*o]+sum[2*o+1];
}
void upmod(int o,int l,int r,int ql,int qr,int x) {
if(mx[o]m) upmod(2*o+1,m+1,r,ql,qr,x);
mx[o]=max(mx[2*o],mx[2*o+1]);
sum[o]=sum[2*o]+sum[2*o+1];
}
void up(int o,int l,int r,int x,int v) {
if(l==r) {
mx[o]=sum[o]=v;
return ;
}
int m=(l+r)/2;
if(x<=m) up(2*o,l,m,x,v);
else up(2*o+1,m+1,r,x,v);
mx[o]=max(mx[2*o],mx[2*o+1]);
sum[o]=sum[2*o]+sum[2*o+1];
}
ll qu(int o,int l,int r,int ql,int qr) {
if(ql<=l&&qr>=r) return sum[o];
int m=(l+r)/2;
ll ans=0;
if(ql<=m) ans += qu(2*o,l,m,ql,qr);
if(qr>m) ans += qu(2*o+1,m+1,r,ql,qr);
return ans;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
bd(1,1,n);
while(m--) {
int op,l,r,x,k;
scanf("%d",&op);
if(op==1) {
scanf("%d%d",&l,&r);
printf("%lld\n",qu(1,1,n,l,r));
}else if(op==2) {
scanf("%d%d%d",&l,&r,&x);
upmod(1,1,n,l,r,x);
}else {
scanf("%d%d",&k,&x);
up(1,1,n,k,x);
}
}
return 0;
}
#include
using namespace std;
#define ll long long
const int N=1e6+5;
int n,m,a[N],d[N];
ll mx[4*N],sum[4*N];
vector v[N];
void bd(int o,int l,int r) {
if(l==r) {
sum[o]=mx[o]=a[l];
return ;
}
int m=(l+r)/2;
bd(2*o,l,m);
bd(2*o+1,m+1,r);
mx[o]=max(mx[2*o],mx[2*o+1]);
sum[o]=sum[2*o]+sum[2*o+1];
}
void up(int o,int l,int r,int ql,int qr) {
if(mx[o]<=2) return ;
if(l==r) {
mx[o]=sum[o]=d[mx[o]];
return ;
}
int m=(l+r)/2;
if(ql<=m) up(2*o,l,m,ql,qr);
if(qr>m) up(2*o+1,m+1,r,ql,qr);
mx[o]=max(mx[2*o],mx[2*o+1]);
sum[o]=sum[2*o]+sum[2*o+1];
}
ll qu(int o,int l,int r,int ql,int qr) {
if(ql<=l&&qr>=r) return sum[o];
int m=(l+r)/2;
ll ans=0;
if(ql<=m) ans += qu(2*o,l,m,ql,qr);
if(qr>m) ans += qu(2*o+1,m+1,r,ql,qr);
return ans;
}
int main() {
for(int i=1;i
#include
using namespace std;
#define ll long long
const int N = 1e4+5;
int t,n,k,q,nd[N],djmax[4*N],jymax[4*N],sjmin[4*N],lz[4*N];
///sjmin存区间内升级需要的最少经验,djmax存区间内的最大等级,
///lz作为惰性标记,如果没有英雄升级的话可以暂时不用把经验往下传,
///jymax存区间内的最大经验。而因为每个英雄的增加经验跟等级有关,
///所以sjmin的计算方法是用距离下一等级(最大等级的下一级)的经验除以当前最大等级,然后向上取整。
void pu(int o) {
djmax[o]=max(djmax[2*o],djmax[2*o+1]);
jymax[o]=max(jymax[2*o],jymax[2*o+1]);
sjmin[o]=min(sjmin[2*o],sjmin[2*o+1]);
}
void pd(int o) {
if(lz[o]) {
lz[2*o]+=lz[o];
jymax[2*o]+=djmax[2*o]*lz[o];
sjmin[2*o]-=lz[o];
lz[2*o+1]+=lz[o];
jymax[2*o+1]+=djmax[2*o+1]*lz[o];
sjmin[2*o+1]-=lz[o];
lz[o]=0;
}
}
void bd(int o,int l,int r) {
djmax[o]=1;
jymax[o]=0;
sjmin[o]=nd[2];
lz[o]=0;
if(l==r) return ;
int m=(l+r)/2;
bd(2*o,l,m);
bd(2*o+1,m+1,r);
}
void up(int o,int l,int r,int ql,int qr,int v) {
if(ql<=l&&qr>=r) {
if(v=nd[djmax[o]+1])
djmax[o]++;
sjmin[o] = (nd[djmax[o]+1]-jymax[o])/djmax[o]+((nd[djmax[o]+1]-jymax[o])%djmax[o]!=0);
return ;
}
}
pd(o);
int m=(l+r)/2;
if(ql<=m) up(2*o,l,m,ql,qr,v);
if(qr>m) up(2*o+1,m+1,r,ql,qr,v);
pu(o);
}
int qu(int o,int l,int r,int ql,int qr) {
if(ql<=l&&qr>=r) return jymax[o];
pd(o);
int m=(l+r)/2;
int ans=0;
if(ql<=m) ans=max(ans,qu(2*o,l,m,ql,qr));
if(qr>m) ans=max(ans,qu(2*o+1,m+1,r,ql,qr));
return ans;
}
int main(){
scanf("%d",&t);
for(int cas=1;cas<=t;cas++) {
scanf("%d%d%d",&n,&k,&q);
for(int i=2;i<=k;i++)
scanf("%d",&nd[i]);
nd[k+1]=2e9;
bd(1,1,n);
printf("Case %d:\n",cas);
for(int i=1;i<=q;i++) {
char op;
int l,r,e;
scanf(" %c",&op);
if(op=='W') {
scanf("%d%d%d",&l,&r,&e);
up(1,1,n,l,r,e);
}else {
scanf("%d%d",&l,&r);
printf("%d\n",qu(1,1,n,l,r));
}
}
printf("\n");
}
return 0;
}
#include
using namespace std;
#define ll long long
const int N = 1e5+5;
int n,m,x,y,tp[N],tr[N];
struct nd{
int x,y;
}a[N],b[N];
bool cmp(nd p,nd q) {
return p.x
#include
using namespace std;
#define ll long long
const int N = 1e6+5;
int t,n,m,a[N],idx[N],mx[4*N];
void bd(int o,int l,int r) {
if(l==r) {
mx[o]=idx[l];
return ;
}
int mid=(l+r)/2;
bd(2*o,l,mid);
bd(2*o+1,mid+1,r);
mx[o]=max(mx[2*o],mx[2*o+1]);
}
void up(int o,int l,int r,int pos) {
if(l==r) {
mx[o] = N;
return ;
}
int mid=(l+r)/2;
if(pos<=mid) up(2*o,l,mid,pos);
else up(2*o+1,mid+1,r,pos);
mx[o] = max(mx[2*o],mx[2*o+1]);
}
int qu(int o,int l,int r,int R,int k) {
if(l==r && mx[o] > R && k<=l) return l;
int mid=(l+r)/2;
if(k<=mid && mx[2*o] > R) {
int ans = qu(2*o,l,mid,R,k);
if( ans != n+1) return ans;
}
if(k<=r && mx[2*o+1] > R) {
int ans = qu(2*o+1,mid+1,r,R,k);
if( ans != n+1) return ans;
}
return n+1;
}
int main(){
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
idx[a[i]]=i;
}
bd(1,1,n);
int last=0;
while(m--) {
int op,x,y;
scanf("%d",&op);
if(op==1) {
scanf("%d",&x);
x^=last;
up(1,1,n,a[x]);
}
else {
scanf("%d%d",&x,&y);
x^=last,y^=last;
last = qu(1,1,n,x,y);
printf("%d\n",last);
}
}
}
return 0;
}
#include
using namespace std;
#define ll long long
const int N = 1e5+5;
int t,n,m,a[N];
int rt[N*20],ls[N*20],rs[N*20],sum[N*20],cnt=0;
void up(int pre,int& o,int l,int r,int pos) {
o=++cnt;
ls[o]=ls[pre];
rs[o]=rs[pre];
sum[o]=sum[pre]+1;
if(l==r) return ;
int m=(l+r)/2;
if(pos<=m) up(ls[pre],ls[o],l,m,pos);
else up(rs[pre],rs[o],m+1,r,pos);
}
int qu(int pre,int o,int l,int r,int k) {
if(l==r && sum[o]-sum[pre] && k<=l) return l;
int num = sum[ls[o]]-sum[ls[pre]],mid=(l+r)/2;
if(k<=mid && num) {
int ans = qu(ls[pre],ls[o],l,mid,k);
if( ans != n+1) return ans;
}
num = sum[rs[o]]-sum[rs[pre]];
if(k<=r && num) {
int ans = qu(rs[pre],rs[o],mid+1,r,k);
if( ans != n+1) return ans;
}
return n+1;
}
int main(){
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
cnt = 0;
for(int i=1;i<=n;i++)
up(rt[i-1],rt[i],1,n,a[i]);
int last=0;
set st;
while(m--) {
int op,x,y;
scanf("%d",&op);
if(op==1) {
scanf("%d",&x);
x^=last;
st.insert(a[x]);
}
else {
scanf("%d%d",&x,&y);
x^=last,y^=last;
last = qu(rt[x],rt[n],1,n,y);
auto it = st.lower_bound(y);
if(it!=st.end()) last=min(last,*it);
printf("%d\n",last);
}
}
}
return 0;
}
#include
using namespace std;
typedef long long ll;
const int N = 1e6+5;
ll n,s[N],ans[N],mi[4*N],lz[4*N],cnt,idx;
void pd(int o) {
if(lz[o]) {
lz[2*o]+=lz[o];
mi[2*o]-=lz[o];
lz[2*o+1]+=lz[o];
mi[2*o+1]-=lz[o];
lz[o]=0;
}
}
void bd(int o,int l,int r) {
if(l==r) {
mi[o]=s[l];
return ;
}
int m=(l+r)/2;
bd(2*o,l,m);
bd(2*o+1,m+1,r);
mi[o]=min(mi[2*o],mi[2*o+1]);
}
void up(int o,int l,int r,int ql,int qr) {
if(ql<=l && qr>=r) {
mi[o]-=cnt;
lz[o]+=cnt;
return ;
}
pd(o);
int m=(l+r)/2;
if(ql<=m) up(2*o,l,m,ql,qr);
if(qr>m) up(2*o+1,m+1,r,ql,qr);
mi[o]=min(mi[2*o],mi[2*o+1]);
}
void qu(int o,int l,int r) {
if(l==r) {
ans[l]=++cnt;
idx=l;
mi[o]=2e18;
return ;
}
pd(o);
int m=(l+r)/2;
if(mi[2*o+1]<=mi[2*o]) qu(2*o+1,m+1,r);
else qu(2*o,l,m);
mi[o]=min(mi[2*o],mi[2*o+1]);
}
int main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
s[n+1]=2e18;
bd(1,1,n+1);
for(int i=1;i<=n;i++) {
qu(1,1,n+1);
up(1,1,n+1,idx+1,n);
}
for(int i=1;i<=n;i++) cout<
///#include
#include
#include
#include
using namespace std;
#define ll long long
const int N = 1e5+5;
int a[N],mi[4*N];
void bd(int o,int l,int r) {
if(l==r) {
mi[o] = a[l];
return ;
}
int m=(l+r)>>1;
bd(o<<1,l,m);
bd(o<<1|1,m+1,r);
mi[o] = min(mi[o<<1],mi[o<<1|1]);
}
int qu(int o,int l,int r,int ql,int qr,int val) {
if(l==r) return mi[o];
if(ql<=l && qr>=r) {
int m = (l+r)>>1;
if(mi[o<<1] <= val) return qu(o<<1,l,m,ql,qr,val);
return qu(o<<1|1,m+1,r,ql,qr,val);
}
int m = (l+r)>>1;
int ans=2e9;
if(ql<=m) ans = qu(o<<1,l,m,ql,qr,val);
if(ans<=val) return ans;
if(qr>m) return qu(o<<1|1,m+1,r,ql,qr,val);
///return -1;
return 2e9;
}
int main(){
int t;
while(~scanf("%d",&t)) {
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
bd(1,1,n);
int q;
scanf("%d",&q);
while(q--) {
int l,r,v;
scanf("%d%d",&l,&r);
if(l==r) {
printf("%d\n",a[l]);
continue;
}
v = a[l];
while(1) {
int x = qu(1,1,n,l+1,r,v);
if(x>v)
break;
v%=x;
if(!v)
break;
}
printf("%d\n",v);
}
}
return 0;
}
#include
#include
using namespace std;
const int N=1e5+5;
int mi[N*4],a[N];
void build(int l,int r,int root)
{
if(l==r)
{
mi[root]=a[l];
return ;
}
int mid=l+r>>1;
build(l,mid,root<<1);
build(mid+1,r,root<<1|1);
mi[root]=min(mi[root<<1],mi[root<<1|1]);
}
int query(int l,int r,int root,int ql,int qr,int val)
{
if(l==r)
return mi[root];
if(l>=ql&&r<=qr)
{
int mid=l+r>>1;
if(mi[root<<1]<=val)
return query(l,mid,root<<1,ql,qr,val);
return query(mid+1,r,root<<1|1,ql,qr,val);
}
int mid=l+r>>1;
int ans=2e9;
if(mid>=ql)
ans=query(l,mid,root<<1,ql,qr,val);
if(ans<=val)
return ans;
if(midv)
break;
v%=x;
if(!v)
break;
}
printf("%d\n",v);
}
}
}
}
return 0;
}
#include
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int N = 1e6+5;
int n,Q,a[N],ans[N],sum[4*N];
vector > v[N];
map mp;
struct nd{
int l,r,id;
}q[N];
bool cmp(nd u,nd v) {
return u.rm) up(2*o+1,m+1,r,p,v);
sum[o] = sum[2*o] + sum[2*o+1];
}
int qu(int o,int l,int r,int ql,int qr) {
if(ql<=l&&qr>=r) return sum[o];
int m=(l+r)/2,ans=0;
if(ql<=m) ans += qu(2*o,l,m,ql,qr);
if(qr>m) ans += qu(2*o+1,m+1,r,ql,qr);
return ans;
}
int main(){
while(~scanf("%d%d",&n,&Q)) {
mp.clear();
for(int i=1;i<=n;i++) v[i].clear();
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=Q;i++)
scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+1,q+1+Q,cmp);
for(int i=1;i<=n;i++) {
v[i].push_back({a[i],i});
int x = a[i];
for(int j=0;j
#include
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int N = 1e6+5;
int t,n,a[N],b[N],pos[N],mi[4*N];
vector va[N],vb[N];
void bd(int o,int l,int r) {
if(l==r) {
mi[o] = a[l];
return ;
}
int m=(l+r)/2;
bd(2*o,l,m);
bd(2*o+1,m+1,r);
mi[o] = min(mi[2*o],mi[2*o+1]);
}
void up(int o,int l,int r,int p,int v) {
if(l == r) {
mi[o] = v;
return ;
}
int m=(l+r)/2;
if(p<=m) up(2*o,l,m,p,v);
if(p>m) up(2*o+1,m+1,r,p,v);
mi[o] = min(mi[2*o],mi[2*o+1]);
}
int qu(int o,int l,int r,int ql,int qr) {
if(ql <= l && qr >= r) return mi[o];
int m=(l+r)/2,ans=inf;
if(ql<=m) ans = min(ans,qu(2*o,l,m,ql,qr));
if(qr>m) ans = min(ans,qu(2*o+1,m+1,r,ql,qr));
return ans;
}
int main(){
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i=1;i<=n;i++) va[i].clear(),vb[i].clear();
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
va[a[i]].push_back(i);
}
for(int i=1;i<=n;i++) {
scanf("%d",&b[i]);
vb[b[i]].push_back(i);
}
int fg = 0;
for(int i=1;i<=n;i++) {
if(va[i].size() != vb[i].size()) {
fg = 1;break;
}
for(int j=0;j