Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- using namespace std;
- unsigned int rez,v[100001],vec[400001];
- bool ok=0;
- void aint(unsigned int nod,unsigned int a,unsigned int b)
- {
- if(a==b)
- {
- vec[nod]=v[a];
- return;
- }
- aint(2*nod,a,(a+b)/2);
- aint(2*nod+1,(a+b)/2+1,b);
- vec[nod]=vec[2*nod]&vec[2*nod+1];
- }
- void query(unsigned int nod,unsigned int a,unsigned int b,unsigned int ua,unsigned int ub)
- {
- if(a>=ua&&b<=ub)
- {
- if(ok==0)
- {
- rez=vec[nod];
- ok=1;
- }
- else
- rez=rez&vec[nod];
- return;
- }
- unsigned int mij=(a+b)/2;
- if(ua<=mij)
- query(2*nod,a,mij,ua,ub);
- if(ub>=mij+1)
- query(2*nod+1,mij+1,b,ua,ub);
- }
- void update(int nod,int a,int b,int ub)
- {
- if(a==b)
- {
- vec[nod]=v[a];
- return;
- }
- int mij=(a+b)/2;
- if(ub<=mij)
- update(2*nod,a,mij,ub);
- else
- update(2*nod+1,mij+1,b,ub);
- vec[nod]=vec[2*nod]&vec[2*nod+1];
- }
- int main()
- {
- #ifdef HOME
- freopen("test.in","r",stdin);
- freopen("test.out","w",stdout);
- #endif // HOME
- unsigned int n,m,i,a,b,nr;
- char c;
- cin>>n>>m;
- for(i=1; i<=n; i++)
- cin>>v[i];
- aint(1,1,n);
- for(i=1; i<=m; i++)
- {
- cin>>c;
- if(c=='Q')
- {
- ok=0;
- cin>>a>>b>>nr;
- query(1,1,n,a,b);
- cout<<(nr&rez)<<'\n';
- }
- else
- {
- cin>>a>>b;
- v[a]=b;
- update(1,1,n,a);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment